动态爬虫漏抓的案例分析(一)
2017-8-24 21:16:10 Author: mp.weixin.qq.com(查看原文) 阅读量:2 收藏

安全开发者的小黄鸭,会不定期的分享我在苦逼开发过程中遇到的一些问题、解决方案,以及新的姿势技巧,大多数推送的文章会比较短。

如果你在安全开发方面有什么问题,也可以直接回复公众号,我会抽时间解答~

一句话总结:触发事件一定要有时间间隔!

先来看抓取的页面源码:

两个<a>标签点击后会分别跳转到 /test4.php 和 /test5.php(抓取时页面已锁定,实际不会跳转,但可以监控到跳转的目标URL),但爬虫并未抓取到 http://localhost/test4.php

检查下phantomjs模块的具体调用日志:

可以看到 id=test4 节点对应的事件确实被触发了,而且还把锚点的变化都记录下来了。但就是没抓到 /test4.php 跳转的请求。

原本以为是因为锚点的问题,锚点阻止了后续的事件执行(一个不负责任的脑洞)。但经过一番调试,发现是触发事件的时候出问题了。

window.location.href 重复执行的时候,浏览器只会执行后面的一个,比如这段代码,可以粘贴到 Console 执行下,页面会跳转到 /456。

那应该如何解决?

重启电脑,然后重装系统

骗你的。触发事件的时候,要留一个短短的间隔。(浏览器: 你太快了

由于 Javascript 的异步非阻塞的特性,还加了个闭包来实现 sleep。

如果不想这么做的话,也可以通过 Hook location对象来解决。

虽然 location对象 在最近版本的 chrome 里已经不能 Hook 了,但像 phantomjs/qtwebkit 之类的以 webkit 为核心的解析器并不会及时的去更新,实测可行。但从可持续发展的角度来看,更推荐第一种方法

因为是浏览器的特性导致的漏抓,所以这个问题不仅会出现在 PhantomJS 中,用其他解析器也是一样的。但解决方案都是通用,大佬们可以检查下自己的爬虫了。

实际上,@世琪 老司机很早就跟我说过这个问题了,但是因为一直没遇到badcase,所以一直处于搁置的状态,搁置的久了,就忘了....今天红老师把badcase丢给我,还捣腾了半天才发现问题...

想了解更多 Hook触发事件 相关的,可以点击 阅读原文,查看我之前在安全客上发表的文章《浅谈动态爬虫与去重》。


文章来源: https://mp.weixin.qq.com/s?__biz=MzU4NjIxNzkyNQ==&mid=2247483669&idx=1&sn=9620692eda7fd734753e9844b9ef57f0&chksm=fdffe1bfca8868a9b5ed0dde51c134a7e14beb87919c09fdc18dcdc58f947a8253606f0d9ecb&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh