Chrome 145 移除 UserAgentReduction 后:Client Hints与User-Agent修改防关联指南要怎么重写

2026-08-03 5 0

运营同学最常见的困惑是:本地检测页明明显示 User-Agent 已改,可一上目标平台就要求验证。问题在于,检测页看的是 UA 字符串,而平台侧真正在看的,可能已经是别的字段。据 Chrome Enterprise 发布说明,Chrome 145 起,UserAgentReduction 策略被移除,简化 UA 成为默认,这直接改变了我们排查环境一致性的方式。

先看事实:Chrome 145 起 UserAgentReduction 策略被移除,简化 UA 成为默认

根据 Chrome Enterprise 官方发布说明(2026年7月确认),从 Chrome 145 开始,UserAgentReduction 策略配置已被完全移除,不再生效。无论是桌面端还是移动端,Chrome 默认发送的都是简化版 User-Agent 字符串。这意味着,过去那种通过在策略里关闭 UA 简化来保持完整 UA 的做法已经失效,网站必须通过 Client Hints(UA-CH)显式请求高熵版本与系统字段。官方日志里写得很明确,这是既定配置变更,不是临时实验。

简化 UA 里还剩什么:被冻结的版本号与被移走的高熵字段

简化后的 UA 字符串变成了什么样?在 Chrome 实施 User-Agent 简化后,HTTP 请求头 User-Agent 中的浏览器版本号会被冻结为 <major>.0.0.0 格式,比如 Chrome/145.0.0.0。也就是说,服务器从 UA 字符串里只能看到主版本号,拿不到完整的小版本信息。如果服务器确实需要精确到小版本,就必须依赖 Accept-CH 机制,显式请求 Sec-CH-UA-Full-Version-List 请求标头。

所以要回答“现在哪些高熵字段还能拿到”,就得看 Client Hints 提供了什么:完整版本列表、架构、平台版本、位数都已从 UA 字符串移出。

UA-CH 的工作方式:站点显式请求,浏览器按需返回

要弄清怎么排查,得先明白 UA-CH 的协商机制。以下机制以 MDN Web Docs 对 NavigatorUAData.getHighEntropyValues() 与 Sec-CH-UA-Full-Version-List 的说明为准。这里就是“User-Agent Client Hints 是什么”的核心答案。

站点如果想获取高熵字段,需要在响应头里带上 Accept-CH,声明需要哪些提示。浏览器在后续的请求中才会附带对应的 Sec-CH-UA-* 标头。例如,如果站点请求了全版本列表,后续请求头里就会带上 Sec-CH-UA-Full-Version-List。而在前端代码里,开发者则可以通过 navigator.userAgentData.getHighEntropyValues() 这个方法,异步获取 architecture、bitness、platformVersion、fullVersionList 等高熵字段。

特别要注意的是,这个 API 的调用权限还受 HTTP 标头 Permissions-Policy: ch-ua-high-entropy-values 管控。该权限管控来自规范定义,站点是否实际启用属于站点侧配置,公开资料未说明各站点的启用情况。如果页面被限制了该权限,那么即使你调用了 getHighEntropyValues(),也可能拿不到数据。这就意味着,高熵字段的提供是有条件、按需的,不是什么固定值。

三处口径必须自洽:请求头 UA、Sec-CH-UA-* 系列、JS 端 userAgentData

现在关键来了。同一个环境里,描述同一台设备的信息,至少有三个来源:

来源字段示例说明
请求头 UAUser-Agent: Mozilla/5.0 ... Chrome/145.0.0.0简化后的 UA,版本号固定为 <major>.0.0.0
UA-CH 标头Sec-CH-UA, Sec-CH-UA-Full-Version-List站点通过 Accept-CH 显式请求后才会返回
JS APInavigator.userAgentData.getHighEntropyValues()异步获取高熵字段,受 Permissions-Policy 限制

这三处描述的是同一台设备,理应彼此对应。如果只改了 UA 字符串,而 Sec-CH-UA-* 标头或 JS 端 userAgentData 返回的仍然是原值,那就造成了“navigator.userAgentData 与 User-Agent 不一致”的问题。公开资料未披露各平台如何比对这些字段;从技术角度可以确定的只有一点——同一环境的三处描述若互相矛盾,这种矛盾在协议层面是可被观察到的,这属于技术推断,不构成对任何平台风控行为的判断。

最容易出问题的三种配置:只改字符串、扩展改写请求头、批量模板未同步更新

结合实际操作,最容易出现不一致的场景有三种:

  1. 只在 UA 字符串上做修改,未同步高熵字段来源。 这是最常见的老经验。改 UA 字符串只是动了请求头的一个字段,但 Sec-CH-UA- 系列标头可能由内核自动生成,如果内核没有同步修改,两者就会对不上。很多人改了 User-Agent 仍被识别出环境异常,原因往往就在这里:请求头改了,内核生成的 Sec-CH-UA- 系列并没有跟着变。
  2. 用浏览器扩展或代理中间层改写请求头。 这种方式可以改变 HTTP 层的 UA 和 Sec-CH-UA-*,但 JS 端 navigator.userAgentData 是浏览器内核直接提供的,扩展未必能干预。如果扩展只改了外层,JS 层原样输出,就可能导致层级分叉。
  3. 团队沿用旧的批量环境模板,模板里的 UA 与内核实际输出的 Client Hints 不匹配。 许多指纹浏览器允许批量创建环境,模板里往往固化了 UA 字符串。如果模板的 UA 是旧版本,而内核升级后输出的 Client Hints 已经变化,两者就不匹配。

每一类问题的验证方式都不同,需要分层去查。

按层自检顺序:先定位哪一层对不上,再决定改哪一处

面对这类问题,建议按以下顺序排查,不要一上来就乱改:

  • 第一步:检查请求头。 打开开发者工具,网络面板里看某个请求的请求头,确认 User-Agent 和 Sec-CH-UA-* 系列是否指向同一浏览器与平台。比如,UA 字符串里的主版本号是 145,而 Sec-CH-UA-Full-Version-List 返回的完整版本列表却指向另一个主版本,即为不一致。
  • 第二步:检查 JS 端。 在控制台执行 navigator.userAgentData.getHighEntropyValues(['architecture', 'bitness', 'platformVersion', 'fullVersionList']),核对返回值是否与第一步看到的一致。这里要注意,返回值是异步的。如果报错或拿不到值,可能受 Permissions-Policy 限制,这是“拿不到”和“拿到错值”的区别,后者更关键。
  • 第三步:如果拿不到高熵字段,先检查 Permissions-Policy。 若响应头中出现对 ch-ua-high-entropy-values 的限制(具体语法以 MDN 的 Permissions-Policy 文档为准),API 就可能不返回高熵信息;至于该限制来自站点策略还是中间层改写,需要逐层比对响应头才能判断,公开资料未提供通用结论。

顺序的目的是“先定位层级、再动配置”。一次只改一处,改完再检测,才能归因。否则一次改了多处,出了问题根本不知道是哪一步造成的。

在 NexBrowser 环境里做参数集中核对与多环境批量抽检

对多账号团队来说,单环境排查只是第一步。批量环境的一致性更需要制度化。NexBrowser 提供独立浏览器环境与指纹/Cookie/缓存隔离,并支持 Chrome 指纹模拟,环境参数可在同一处集中查看与调整,便于把上一节的自检动作放在同一个环境入口里完成。

团队环境协作功能则有助于统一模板口径。比如,给所有成员分发的环境模板都使用同一套 UA 与 Client Hints 设置,避免成员各自修改造成分叉。此外,NexBrowser 提供 Local API 与 WebDriver 接口,团队可据此把上述自检脚本化,在多个环境上重复执行同一套核对流程。具体可读取哪些参数以实际接口文档为准。这些都只是为了便于检查与调整,具体怎么用,完全看你的场景。

常见说法对照:哪些结论在现有公开资料里站不住

最后,梳理几个容易被误传的说法:

  • “改 UA 字符串就等于改环境标识”——不成立。高熵字段另有来源,UA 只是其中之一。
  • “本地检测页显示正常就等于服务端看到一致”——不一定。检测页可能只读取了 UA,而服务端可能请求了 Client Hints,两者信息不同步。
  • “某某参数组合可以规避风控”——无公开来源,不作判断。因为各平台风控的具体比对方式并未公开,我们只能基于“描述自洽”的原则去调整。

本文的结论只基于 Chrome 145 移除 UserAgentReduction 官方说明与 MDN 规范,不涉及任何平台内部逻辑。你的目标应该是保持自身描述自洽,而不是追求一套固定的“神奇参数”。

建议你从手上一两个环境开始,按照上面的分层顺序做一次核对,确认没有跨层冲突后再推广到批量模板。如果团队环境数量多,不妨把这项核对做成上线前的固定检查项,用工具辅助批量抽检。

相关文章

Canvas指纹原理拆解:竞品上了Chrome 150与增强型Canvas掩码之后,掩码到底能改到哪一层?
Chrome 145 移除 UserAgentReduction 后:Client Hints与User-Agent修改防关联指南要怎么重写
Cloudflare 把 JA4 TLS 签名写进规则变量后:浏览器指纹真实性检测要补上握手层这一项
Chromium 转双周发版、竞品集中上 Chrome 150 内核之后:WebGL指纹对跨境账号关联的影响该怎么重新评估
从检测页一串 .local 主机名说起:WebRTC 本地 IP 被 mDNS 替换后,还要核对哪些信息?
Chrome IP保护只遮名单内第三方请求:跨境团队的 IP 一致性自检该怎么重写

评论(0)

暂无评论

发布评论