返回概览 更多文章

你的 User-Agent 在撒谎,你的 Chromium 版本不会。

正在交叉核对你的浏览器所声称的版本……

打开浏览器控制台,输入 navigator.userAgent。那串写着你是“Windows 上的 Chrome 137”的字符,只不过是浏览器随手递出来的一段文本。用一个扩展、大约两次点击就能改掉它,而反检测浏览器更是在每一次请求里都会重写它。所以在追踪者眼里,你的 User-Agent 是一种说法,而不是事实。

问题在于,紧挨着这个说法的,其实有一个事实。每一个版本的 Chromium 都在引擎里内置了一组特定的网页特性。你可以给盒子换个标签,却没那么容易改动盒子里真正装的东西。

一句话总结:你的 User-Agent 是可以随意编辑的文本,但浏览器支持的特性不是。读一读这些特性,就能得到真实的 Chromium 版本。如果它和 User-Agent 对不上,你看起来就是在伪装。

本页上的这个小工具做的正是这件事。它完全无视你的 User-Agent,仅凭浏览器实际支持的特性,推算出你真实的 Chromium 版本。

特性检测如何算出你的版本

每隔几周,Google 就会发布一个新的 Chromium 版本,每一版都会开启少数几项新的网页特性。这里加一个 CSS 属性,那里添一个 JavaScript API。所有这些都公开记录在 Chrome Platform Status 上。

这就给了我们一条可以利用的时间线,我们只要顺着它往上走,直到你的浏览器跟不上为止:

逐级走过功能时间线
  1. 支持
    Chromium 144
    新增 Temporal API
    你的浏览器支持此功能
  2. 支持
    Chromium 145
    新增 text-justify
    你的浏览器支持此功能
  3. 支持
    Chromium 146
    新增 Iterator.concat()
    你的浏览器支持此功能
  4. 支持
    Chromium 147 你在这里
    新增 contrast-color()
    你的浏览器支持此功能
  5. Chromium 148
    新增 revert-rule
    你的浏览器缺少此功能
此浏览器支持截至 Chromium 147 的所有功能,但不支持 148,因此无论其 User-Agent 如何声称,147 才是它真正的引擎版本。

巧妙之处在于,这一切都无法靠编辑一段字符串来伪造。在你的引擎里,'variants' in Intl.Locale.prototype 要么为真,要么为假。要伪造特性本身,你就得换上一个完全不同的浏览器构建。

这一切为什么重要

单看这一点,知道你用的是 Chromium 137 并不算什么大事,互联网上大多数人也都是。真正重要的,是你的这套说辞能不能自圆其说。

一个正常的、未经改动的浏览器是自洽的:Chrome 137 的 User-Agent 之下就是 Chromium 137 的特性集,因为二者出自同一个构建。可一旦有东西只伪造了 User-Agent——比如某个隐私扩展、某个廉价代理,或者某个配置有误的自动化工具——两者就对不上了。试着拨动下面的开关看看:

它声称的
Chrome 120
User-Agent 字符串· 已编辑
vs
它实际的样子
Chromium 137
通过特性检测识别的引擎
不匹配
声称与真实引擎不一致。这种矛盾正是欺诈和反机器人系统所寻找的破绽。

这种自相矛盾,比版本号本身要显眼得多。只伪造一个信号、却不碰引擎,反而会让你更容易被挑出来,而不是更难。关于这一点,我们在各浏览器在指纹识别上的对比Widevine DRM 的怪现象里有更深入的讨论。

到底该怎么办

  1. 让浏览器保持更新。 老旧的引擎本身就是一种指纹,而且还是一重安全隐患。这个小工具会告诉你,你的真实版本是不是已经落后了。
  2. 不要只伪装一半。 改掉 User-Agent 却放着引擎不管,比什么都不做还糟,因为这恰恰制造出了追踪者正在搜寻的那种不一致。
  3. 让整套堆栈保持一致。 如果你确实需要运行多个身份——用于广告核验、市场调研,或者管理大量账户——那么目标就是让 User-Agent、引擎特性以及其他每一个信号,都讲出同一个一致的故事。

最后这一点靠人手去做非常困难,而这正是反检测浏览器存在的全部理由。Incogniton 会为每一个配置文件搭建一个真实、一致的 Chromium 底座,这样你的特性所暴露出的引擎,就会真正与你所呈现的身份相吻合,而不是与它相互矛盾。

Incogniton 徽标

提升你的隐私保护

箭头