扩展很少因为“装了”就被标记;真正的原因是它改写了页面能测到的数值,让浏览器自相矛盾,检测系统才会把这种不一致当成自动化的迹象,并据此提高风险分。
会,但原因和多数人以为的不一样。扩展几乎从不因为“被安装”而被标记。它让你被标记,是因为它改变了页面能测量到的内容,使你的浏览器不再前后一致:User-Agent 说一套,平台信息说另一套,一个本该是原生的属性竟然是一段 JavaScript 函数。
检测器会把这种矛盾解读为“有东西在篡改这个浏览器”,而在外部看来,篡改恰恰是自动化的典型特征。本文按扩展类别逐一说明:哪些类别会引发问题、每一类破坏了哪个信号,以及检测器为什么这样打分。
核心要点
- 触发标记的是一致性被破坏,而不是扩展本身。 页面会比对本应一致的值(User-Agent 与平台、顶层窗口与 iframe、getter 与原生代码)。扩展只改其中一侧,就制造出了不一致。
- 六类扩展造成大部分问题: 用户代理切换器、反指纹或 Canvas 噪声工具、重定义
navigator属性的扩展、代理/VPN 管理扩展、忘了关闭的自动化辅助工具,以及开发者工具。 navigator.webdriver不是扩展信号。 它由自动化框架设置,普通扩展不会设置。把误判怪到它头上,只会让你找错方向。- 检测器按组合打分。 单个异常信号很少会拦住谁,但两三个叠加就可能越过网站的阈值。
- 解决办法是诊断: 找出是哪个扩展破坏了一致性,并在受影响的网站上把它关掉。
扩展如何变成机器人信号
机器人检测脚本并不会去问你运行了哪些扩展。如果你想了解那套机制,浏览器扩展的隐私风险介绍了页面如何检测已安装的扩展。本文从下一步开始:扩展已经在那里,并且改动了页面能观察到的某些东西。
被改动的值大多来自两个地方。一是内容脚本改变页面眼中的浏览器,例如在页面上下文里覆盖某个属性,正如 Chrome 内容脚本文档所描述的。二是扩展改变网络层,从而改变请求头或可见 IP。无论哪种方式,页面手里都有了两个本应吻合却对不上的来源。
六大类别
1. 用户代理与平台切换器
这类扩展替换 User-Agent 字符串,通常是为了让网站把你当成另一种浏览器或设备。字符串变了,浏览器的其余部分却没跟着变。navigator.platform、Client Hints 请求头、渲染引擎的行为,以及 iframe 内的 navigator 对象,仍可能报告真实的浏览器。
一个 Windows 上的 Chrome 字符串,配着 Linux 平台值和仅 Firefox 才有的特性集,正是检测器要找的矛盾。具体机制见用户代理伪装为何适得其反和网站如何检测用户代理伪装。
2. 反指纹与 Canvas 噪声扩展
随机化 Canvas 或音频输出的工具,本意是阻止指纹识别。问题在于,稳定的设备每次都会返回相同的 Canvas 结果。如果对同一幅图形的两次读取得到不同的像素,随机性本身就是破绽。精心实现的方案能避开这一点,粗糙的则不能。权衡见 Canvas 指纹噪声。
3. 重定义 navigator 属性的扩展
有些扩展通过在 JavaScript 中定义替代 getter,来覆盖 navigator.userAgent、navigator.languages 等值。原生 getter 传给 Function.prototype.toString 时会输出 function get userAgent() { [native code] };用 JavaScript 写的替代函数则会输出它自己的源码。
页面还可以用 Object.getOwnPropertyDescriptor 检查该属性,发现 getter 位于通常不会出现的位置。这类“谎言检测”正是 CreepJS 交叉比对可信与不可信值的方式。
4. 代理与 VPN 管理扩展
代理管理扩展会改变你的出口 IP,却不会改变系统时区、语言列表或区域设置。IP 说在一个国家,浏览器说在另一个国家。这种不匹配是标准的风险输入项,而且对没做错任何事的人同样会触发。见时区与 IP 不匹配和VPN 检测为何会误报。
5. 忘了关闭的自动化辅助工具
验证码求解器、宏录制器、表单自动填充和用户脚本管理器,会以真人不会采用的方式操作页面:瞬间填满字段、合成事件、点击前没有任何鼠标移动。用户脚本管理器只是在选定页面上运行你自己脚本的工具,正如 Chrome userScripts API 所记载的。工具本身是中性的,但它对时序和输入事件的影响,正是行为检测器所测量的对象。
6. 开发者工具与设备模拟
打开 DevTools 和设备模拟会改变窗口尺寸、触控支持以及某些调用的时序。一个自称手机、却带着鼠标且没有触点的桌面浏览器,看起来就是不一致的。这一项很容易无意中触发,也很容易修复:关掉 DevTools 即可。
广告拦截器是另一种情况,因为它干扰的是诱饵元素而不是浏览器属性。它有专门的文章。
navigator.webdriver 呢?
当浏览器由自动化框架控制时,navigator.webdriver 为 true。普通扩展不会设置它。如果你被标记而 webdriver 读数是 false,原因就是上述一致性问题之一,而不是这个标志。反过来也成立:扩展列表干干净净的自动化浏览器,照样会报告 true。
为什么正常用户也会中招
隐私和无障碍扩展是正当的,检测器也清楚这一点。所以它们按组合而不是单个信号打分。自动化检测技术解释了许多弱信号如何合成一个判定,网站如何标记你的浏览器则从访客的视角梳理了同一套评分过程。
倒霉的情形是叠加:用户代理切换器加 Canvas 噪声工具再加代理扩展。单独看每一个都说得过去,合在一起却给了页面三个不同的理由不信任这个浏览器。
找出是哪个扩展惹的祸
你无需靠猜。我们的机器人检测工具完全在你的浏览器中运行检查,并标出哪些检测项未通过。它不会检测或列出你安装的扩展,它检测的是扩展的影响:被篡改的 navigator getter、User-Agent 与顶层窗口不一致的 iframe、被随机化的 Canvas 输出、平台与内核不匹配、webdriver,以及 DevTools 或设备模拟。
- 在所有扩展都启用的状态下运行检查,记下被标记的检测项。
- 打开一个没有任何扩展的干净配置文件,再运行一次。
- 对比。某一项从被标记变为通过,就指向了需要排查的类别。
- 逐个重新启用扩展,直到该项再次被标记。
如果某个网站在拦你,请在该网站上停用有问题的扩展,而不是把它全部卸载。这是一套诊断流程,不是隐藏什么的方法:如果扩展改变了浏览器上报的内容,让它重新前后一致才是诚实的结果。
常见问题
仅仅安装扩展就会被标记吗?
不会。“存在”不是信号。标记来自扩展引入的可测量的不一致,或是瞬间填表之类的行为。
隐私扩展会让我更像机器人吗?
可能会。覆盖数值或随机化输出,会制造出普通浏览器没有的不匹配,而稀有的配置本身也更容易被识别。
扩展会设置 navigator.webdriver 吗?
不会。它由自动化框架设置,普通扩展会让它保持 false。
我怎么知道哪个扩展有问题?
在开启扩展和干净配置文件两种状态下运行同一项检查,然后逐个重新启用扩展,同时观察哪一项发生变化。


