大概从 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