打开浏览器控制台,输入 navigator.userAgent。那串写着你是“Windows 上的 Chrome 137”的字符,只不过是浏览器随手递出来的一段文本。用一个扩展、大约两次点击就能改掉它,而反检测浏览器更是在每一次请求里都会重写它。所以在追踪者眼里,你的 User-Agent 是一种说法,而不是事实。
问题在于,紧挨着这个说法的,其实有一个事实。每一个版本的 Chromium 都在引擎里内置了一组特定的网页特性。你可以给盒子换个标签,却没那么容易改动盒子里真正装的东西。
本页上的这个小工具做的正是这件事。它完全无视你的 User-Agent,仅凭浏览器实际支持的特性,推算出你真实的 Chromium 版本。
特性检测如何算出你的版本
每隔几周,Google 就会发布一个新的 Chromium 版本,每一版都会开启少数几项新的网页特性。这里加一个 CSS 属性,那里添一个 JavaScript API。所有这些都公开记录在 Chrome Platform Status 上。
这就给了我们一条可以利用的时间线,我们只要顺着它往上走,直到你的浏览器跟不上为止:
- Chromium 144新增
Temporal API你的浏览器支持此功能 - Chromium 145新增
text-justify你的浏览器支持此功能 - Chromium 146新增
Iterator.concat()你的浏览器支持此功能 - Chromium 147 你在这里新增
contrast-color()你的浏览器支持此功能 - Chromium 148新增
revert-rule你的浏览器缺少此功能
巧妙之处在于,这一切都无法靠编辑一段字符串来伪造。在你的引擎里,'variants' in Intl.Locale.prototype 要么为真,要么为假。要伪造特性本身,你就得换上一个完全不同的浏览器构建。
这一切为什么重要
单看这一点,知道你用的是 Chromium 137 并不算什么大事,互联网上大多数人也都是。真正重要的,是你的这套说辞能不能自圆其说。
一个正常的、未经改动的浏览器是自洽的:Chrome 137 的 User-Agent 之下就是 Chromium 137 的特性集,因为二者出自同一个构建。可一旦有东西只伪造了 User-Agent——比如某个隐私扩展、某个廉价代理,或者某个配置有误的自动化工具——两者就对不上了。试着拨动下面的开关看看:
这种自相矛盾,比版本号本身要显眼得多。只伪造一个信号、却不碰引擎,反而会让你更容易被挑出来,而不是更难。关于这一点,我们在各浏览器在指纹识别上的对比和Widevine DRM 的怪现象里有更深入的讨论。
到底该怎么办
- 让浏览器保持更新。 老旧的引擎本身就是一种指纹,而且还是一重安全隐患。这个小工具会告诉你,你的真实版本是不是已经落后了。
- 不要只伪装一半。 改掉 User-Agent 却放着引擎不管,比什么都不做还糟,因为这恰恰制造出了追踪者正在搜寻的那种不一致。
- 让整套堆栈保持一致。 如果你确实需要运行多个身份——用于广告核验、市场调研,或者管理大量账户——那么目标就是让 User-Agent、引擎特性以及其他每一个信号,都讲出同一个一致的故事。
最后这一点靠人手去做非常困难,而这正是反检测浏览器存在的全部理由。Incogniton 会为每一个配置文件搭建一个真实、一致的 Chromium 底座,这样你的特性所暴露出的引擎,就会真正与你所呈现的身份相吻合,而不是与它相互矛盾。