大概从8月6号中午开始,「暗网交易市场」的爬虫就开始疯狂报「登录失败」的错误,下午抽空修复了一下,发现deepmix的站长利用了一个Cookie机制配合Tor Browser的特性很巧妙地区分出正常访问和爬虫,记录一下浪费在这上面的两个小时。
定位问题
deepmix的登录页面需要从入口跳转多次进入,这几次跳转均正常,只有在登录POST请求发送之后,又跳转回入口页进入死循环,可以确定问题位于登录POST请求处。
一开始判断是网站做了什么反爬措施识别了非浏览器的请求,准备用Chrome配合Burp抓包看看有什么区别,但是Chrome也出现了同样的问题,无限跳转入口页。
Tor Browser是一个把Tor和Firefox打包在一起魔改后的浏览器,按理说和正常浏览器是没什么区别的,不应该出现Chrome也被识别出来问题,只能重点抓Tor Browser的包来看,但Tor Browser的代理必须配置到Tor的监听端口上,不能配到Burp里,只好在调试工具里看。
非常明显,Chrome登录时POST请求只带了3个cookie,而Tor Browser登录时会带走6个cookie。
网站可以根据POST请求中的Cookies轻易鉴别出Tor Browser和其余请求。
原理
为什么Chrome请求的时候会少3个cookie呢?这就要注意少的那3个cookie的特殊之处了,缺少的phpbb3_nspa_k
、phpbb3_nspa_sid
、phpbb3_nspa_u
都有一个secure
属性。
标记为 Secure 的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。但即便设置了 Secure 标记,敏感信息也不应该通过Cookie传输,因为Cookie有其固有的不安全性,Secure 标记也无法提供确实的安全保障。从 Chrome 52 和 Firefox 52 开始,不安全的站点(http:)无法使用Cookie的 Secure 标记。
因为Chrome访问时判断请求地址是HTTP协议,带有secure
标记的cookie不传送,导致登录失败,而爬虫的session机制一般都是遵循标准,也同样不带有这3个cookie而失效。
Tor Browser修改了浏览器的安全判断,当通过Tor网络访问时,均认为是安全链接。deepmix借用了Tor Browser的这一特性,在入口页跳转的过程中塞进去3个secure
的cookie,达到在注册、登录等关键页面上拦截爬虫的效果。
修复
修复这个问题也很简单,只需要重置所有cookie的secure属性即可。
for c in session.cookies:
c.secure = False