Chrome 的 User-Agent 缩减功能冻结了 UA 字符串中的次版本号、系统版本和设备型号。了解具体变化、原因及替代方案。
如果你 Chrome 的 User-Agent 字符串显示为 Chrome/143.0.0.0,而 chrome://version 里的真实构建号却是 143.0.7499.96 之类的四段数字,两边你都没有看错——Chrome 确实不再上报自己的精确版本了。这不是 bug,而是 Chrome **User-Agent 缩减(User-Agent Reduction)**计划有意为之的结果:这项持续多年的努力,把被动广播的 UA 字符串削减为信息量极低的存根,同时把具体细节挪到了一个需按需请求的 API 中。下面来看看具体删掉了什么、替换成了什么,以及这些被冻结的值对伪装检测意味着什么。
核心要点
- Chrome 的 User-Agent 缩减从 UA 字符串中移除了三项内容:次版本/构建/补丁版本号、精确的操作系统版本,以及设备型号。
- 主版本号之后的部分现在一律写作
0.0.0——无论实际是哪一个补丁版本,Chrome 143 都统一上报Chrome/143.0.0.0。桌面端系统字符串也被冻结为固定值,例如自 Windows 10 起的所有 Windows 版本都统一写作Windows NT 10.0。 - Android 设备型号被替换为通用占位符
K,报告的 Android 版本也一律冻结为10,与真实设备和系统版本无关。 - 被移除的细节并未消失,而是转移到了 User-Agent Client Hints(UA-CH)——只有服务器明确请求时才会披露。
- 由于冻结后的 UA 不再随真实更新而变化,当它与浏览器真实的、通过特性检测得出的引擎版本不一致时,反而是一个更强的伪装信号,而非更弱的信号。
具体删除了什么
根据 MDN 的 User-Agent 缩减参考文档,Chrome 的缩减恰好针对三个字段:
- 精确的平台/系统版本——不再是你真实的 Windows 版本、macOS 具体版本或 Android 版本。
- 设备型号——Android 手机/平板的型号字符串被移除。
- 浏览器次版本号——只有主版本号仍有意义,其余部分一律归零。
替换后的值是固定的,而非近似值——同一平台上的每一台设备上报的字符串完全相同:
| 平台 | 冻结后的值 |
|---|---|
| Windows | Windows NT 10.0; Win64; x64(Windows 10 与 11 均如此) |
| macOS | Macintosh; Intel Mac OS X 10_15_7 |
| Linux | X11; Linux x86_64 |
| ChromeOS | X11; CrOS x86_64 14541.0.0 |
| Android | Android 10; K(真实设备型号被字母 K 取代) |
用一组真实的前后对比就能看清效果。以前 Chrome for Android 的真实 UA 大概是这样:
Mozilla/5.0 (Linux; Android 16; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.7499.96 Mobile Safari/537.36
缩减后,同一台设备上报的变成了:
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36
真实的 Android 16 版本和 Pixel 9 型号名都消失了,主版本号之后的 0.7499.96 也统统归零为 0.0.0。主版本号(143)被保留了下来,因为网站的确需要它来做兼容性判断——它是唯一仍在被动广播的版本细节,也确实会随 Chrome 升级而递增。
Google 为何选择冻结而非直接删除
2021 年 Chromium Blog 的原始公告将问题归纳为 UA 字符串的两个缺陷:无论是否有脚本发起请求,它都会在每次请求中被动暴露大量身份信息;而且其非结构化的自由格式让它成为维护上的负担——浏览器无法安全地改动它,因为很多网站依赖对其做模式匹配。如果直接删除这些字段,会瞬间破坏所有依赖 UA 嗅探的脚本。而将它们冻结为固定的、被广泛共享的值,则既保留了字符串的格式(老旧解析器不会崩溃),又让具体的值失去了识别价值——因为如今数百万台互不相关的设备都发出了字节级完全相同的字符串。
这次上线过程被有意拉长,横跨了很多个 Chrome 版本:先是 Origin Trial(源试用),再逐阶段废弃旧行为,且桌面端先行、Android 在后。这样安排正是为了让那些依赖精细 UA 数据(设备型号、精确的系统版本、精确次版本号)的网站,有足够时间在旧行为彻底停止之前迁移到明确的替代方案。
被移除的细节转移到了哪里
没有任何东西被真正丢弃——Chrome 为这些信息专门搭建了一条并行通道:User-Agent Client Hints(UA-CH)。旧版 UA 默认广播一切,而 UA-CH 反其道而行之:一小部分低熵提示(品牌、是否移动设备、平台名称)仍会自动发送,但缩减移除的高熵数据——完整版本号、精确系统版本、设备型号——现在只有当服务器发送 Accept-CH 请求头明确索要时才会释放,客户端则通过 navigator.userAgentData.getHighEntropyValues() 读取。这些信息依然存在,只是不再主动交给每一个什么都没问的服务器。
为什么网站和脚本会因此出问题
任何解析 UA 字符串以获取"哪个浏览器、大致哪个主版本、是移动端还是桌面端"以外细节的代码,现在都会得到过时或错误的答案。曾经依赖 Android 型号字符串做判断的设备检测库、记录精确系统版本号的统计脚本,或依赖 navigator.userAgent 做精确版本检查的 QA 工具,都会悄悄退化——它们不会报错,只是默默地对每个用户都返回 0.0.0 和 K。这正是这次取舍的代价:真实的隐私收益(每次请求的被动指纹面显著缩小)由那些没能及时迁移到 UA-CH 的一方,以兼容性债务的形式买单。
检测层面的意义:被冻结的 UA 说得更少,两边都是
对指纹识别和伪装检测而言,缩减带来了一个有趣的副作用。以前,UA 的补丁版本号会随每一次真实更新而前进,因此一个明显过时的声称版本本身就是个(虽弱但存在的)线索。现在,缩减后的 UA 本该看起来是静态的——补丁版本之间那串 0.0.0 纹丝不动才是正常状态,光看字符串,刚装好的浏览器和几个月没更新的浏览器毫无区别。这消除了一个较弱的信号,但没有消除真正重要的信号:网页仍然可以通过特性检测,独立于冻结的 UA 字符串所声称的内容,去询问 JavaScript 引擎它实际运行的到底是哪个渲染引擎、哪个版本。如果一个浏览器的 UA 声称是 Chrome 143,但其真实的、通过特性检测得出的引擎版本明显更旧或更新——或者完全属于另一个引擎家族——这种矛盾正是如何检测 User-Agent 伪装一文所讨论的那类信号。BrowserInsight 的内核检测工具会运行这套特性检测探测,并将结果与你声称的 UA 并排展示,让你直接看出两者是否一致。
亲自试一试
打开 DevTools 并运行 navigator.userAgent。如果你用的是较新版本的 Chrome(或任何现代 Chromium 内核浏览器),应该会看到主版本号之后的部分都是 0.0.0——把它和 chrome://version 里那个四段式构建号一比,就能看清究竟隐去了什么。在 Android 上,检查设备令牌是否显示为 K 而非你真实的型号名称。然后用 BrowserInsight 的内核检测工具与你真实的引擎版本做对比——该工具会独立于(如今已冻结的)UA 字符串所声称的内容,检测你真实的渲染引擎。
常见问题
Firefox 和 Safari 也冻结了它们的 User-Agent 字符串吗?
没有,缩减是 Chromium 专属的计划;Firefox 和 Safari 仍然发送传统的、未经缩减的 UA 字符串。只有基于 Chromium 的浏览器(Chrome、Edge、Brave、Opera 及其他同源浏览器)会应用本文所述的冻结值。
Chrome for iOS 也适用 User-Agent 缩减吗?
不适用。iOS 上的 Chrome 被要求使用苹果的 WebKit 引擎而非 Chromium 自家的 Blink 引擎;缩减的适用范围仅限于基于 Blink 的 Chrome,并不覆盖 Chrome for iOS 和 Android WebView——这两者仍然发送传统的 UA 字符串。
我的网站会因此出问题吗?
只有当它直接从 navigator.userAgent 或 HTTP 请求头中读取精细的 UA 字段——精确系统版本、设备型号或浏览器次版本号——才会受影响。如果是这样,请迁移到 User-Agent Client Hints,它仍能通过明确请求提供这些细节。只检查浏览器家族和主版本号的代码不受影响。
冻结后的 0.0.0 版本号本身可疑吗?
不可疑——这是如今每一个真实、最新的 Chromium 浏览器的预期默认值,本身不带任何信号。真正可疑的是,冻结后的 UA 与其他独立检测出的信号(例如浏览器真实的、特性检测得出的引擎版本,或其 client hints 数据)不一致。
结论
User-Agent 缩减是一次安静却刻意为之的权衡:Chrome 保留了 UA 字符串的格式以避免灾难性的破坏,同时将其中每一个具体的、可识别的值都替换成了数百万台设备共享的固定字符串。这些细节并未消失,而是转移到了 User-Agent Client Hints——一个仅在明确请求时才披露信息的 API。对于从事指纹识别或伪装分析的人来说,实际的结论是:UA 字符串本身如今几乎不值得单独信任;真正重要的是,它是否与浏览器难以轻易伪造的其他信号相一致。
延伸阅读:

