问你的浏览器它跑在什么操作系统上,你得到的不会是一个答案,而是五个。User-Agent 字符串会报出一个操作系统。navigator.platform 也会。Client Hints API、浏览器在每个请求上都会附带的 Sec-CH-UA-Platform 头,以及(在 Firefox 中)那个古老的 navigator.oscpu 属性,全都会。
在一台正常的机器上没人会注意到这一点,因为这五处说的都是同一件事。可一旦你改动了其中一处却忘了其余几处,你就不再像一台 Mac 或 Windows PC,而是变成了某种有意思得多的东西:一个正在说谎的浏览器。
本页上的这个小工具此刻正在你的浏览器上执行的,就是这套一模一样的交叉比对。
浏览器报出操作系统的五个地方
- User-Agent 字符串。经典之选。
Mozilla/5.0 (Windows NT 10.0; Win64; x64)...,地球上每一款伪造扩展都会改它。 navigator.platform。一个古老得多的 JavaScript 属性,大多数伪造工具压根就把它给忘了。navigator.userAgentData.platform。Chromium 浏览器里那套现代的 Client Hints API。任何脚本都能读取,无需任何权限。Sec-CH-UA-Platform头。同样是 Client Hints 数据,但会随每个请求一起从网络发出。网站的服务器在你的 JavaScript 还没跑过一行的时候就已经读到了它。navigator.oscpu。仅限 Firefox。而这一点本身就是信息:一个自称“Windows 上的 Chrome”的浏览器却暴露了oscpu,那它其实已经露馅了。
这些并不来自某个共享的设置。改动 User-Agent 不会更新那些请求头,而覆写某个 JavaScript 属性也触及不到网络层。正是这种彼此独立,让交叉比对得以奏效:
这和抓出版本号伪造的是同一个陷阱,我们在 你的 User-Agent 会撒谎,你的 Chromium 版本不会。 一文中讲过。这个规律可以推而广之:你伪造的每一个信号,都多给了一次机会去和你没伪造的那些信号自相矛盾。
真实的浏览器也撒谎,只不过撒得有章可循
让人意外的地方在这里:一个诚实的浏览器同样不会准确报出你的操作系统。
- 在 64 位 Windows 上,
navigator.platform报的是Win32。从上世纪九十年代起它就这么报,改掉它会弄坏那些老网站。 - 在 Apple Silicon 的 Mac 上,它报的是
MacIntel。里面根本没有 Intel,但这个标签在换芯之后还是保留了下来。 - 每一台现代 Mac 的 User-Agent 都会把上报的 macOS 版本号封顶,所以不同的 macOS 发行版可能呈现出完全相同的字符串。
追踪器把这些标准谎言背得滚瓜烂熟,而这是把双刃剑。一个因为觉得 Win64 听起来更正确而去这么报的伪造行为,会立刻变得可疑,因为从来没有哪个真实的浏览器这么说过。要想蒙混过关,赝品必须以和真品一模一样的方式撒谎。而大多数伪造工具并不懂这些门道。
就算标签完美无缺,也照样会泄露
假设你做得一丝不苟:User-Agent、navigator.platform、Client Hints 以及那些请求头全都被改写成一致指向 macOS。处处一致。这就完事了?
还差得远。那些标签只是操作系统里你能改名的那一部分。操作系统的其余部分还是会照着自己本来的样子行事:
字体是其中动静最大的一个。Windows 自带 Segoe UI 和 Calibri,macOS 自带 Helvetica Neue 和 San Francisco,各种 Linux 发行版则自带 DejaVu。一个脚本在几毫秒之内就能把这些探测出来(我们的 canvas 指纹文章 演示了这套测量手法)。WebGL 的 renderer 字符串同样直白:Direct3D 就意味着 Windows,Metal 就意味着 Mac,绝无例外。
所以,操作系统伪造并不是一个开关那么简单。它既是个标签问题,也是个行为问题,而行为问题要难对付得多。
到底该怎么做
- 如果你不是在刻意管理多重身份,那就别去伪造你的操作系统。你会加入一小撮自相矛盾的怪浏览器,而不是那庞大的正常浏览器人群。融入人群胜过藏起来。
- 绝不要只伪造一半。一个只改字符串的 User-Agent 切换器只会让你更容易被认出来,而不是更难。如果你没法把每一处表面都改掉,那就一处都别改。
- 如果你确实需要相互独立的多重身份,那就让整个技术栈保持一致。标签、请求头、字体、WebGL,一个都不能少。这正是防检测浏览器存在的意义所在。Incogniton 会这样去构建每一个配置文件:让操作系统这套说辞从网络层一直到字体列表都讲得前后一致,而不是往一台没动过的机器上硬贴一个新标签。
想看看你自己的浏览器扛不扛得住?本页上的这个小工具会检查你的操作系统信号,而 完整扫描器 还会连同版本号检查、WebRTC 泄露测试以及另外十来项测试一起跑起来。