浏览器指纹与环境检测的对抗与模拟
最近在调试ZLibrary的登录接口时,遇到了一个诡异的问题:明明请求头、Cookie、IP代理都配置得完美无缺,可每次提交登录都会返回“环境异常”的提示。打开DevTools仔细对比网络请求,发现我的Python脚本和真实浏览器发出的请求,在Header上看几乎一模一样。问题出在哪儿?直到我把目光投向了那些隐藏在请求深处的指纹参数——window.navigator对象里的那些属性,才意识到我们已经进入了爬虫对抗的深水区:浏览器指纹与环境检测。
指纹是什么?不只是User-Agent那么简单
很多人以为改个User-Agent就能伪装成浏览器,这在十年前或许还行得通。现在的环境检测早已深入到浏览器的每一个角落。浏览器指纹是一组能够唯一标识浏览器环境的特征集合,包括但不限于:User-Agent、屏幕分辨率、时区、语言、插件列表、Canvas渲染特征、WebGL指纹、字体列表、AudioContext指纹等等。ZLibrary这类高安全需求的站点,往往会采集数十个这样的特征值,组合成一个指纹哈希。服务器比对这次请求的指纹和上次登录的指纹是否一致,不一致就可能触发风控。
我遇到过最棘手的情况是,即使我用Selenium操控真实浏览器,因为某些扩展程序或开发者设置改变了默认字体,指纹也会和“纯净”环境有微妙差异。这种差异人眼难以察觉,但算法一眼就能识破。
从DevTools里挖出指纹参数
打开Chrome的DevTools,在Console里输入window.navigator,回车。你会看到一个庞大的对象。ZLibrary不会全量采集,但关键的几个他们一定会抓:
// 这是他们可能采集的部分(实际会更多)
navigator.userAgent
navigator.platform
navigator.language
navigator.languages
navigator.hardwareConcurrency // CPU核心数
navigator.deviceMemory // 内存大小(GB)
screen.width
screen.height
screen.colorDepth
window.devicePixelRatio
更高级的还包括Canvas指纹:
const canvas = document.


2790

被折叠的 条评论
为什么被折叠?



