PowerScan
ZH

User-Agent 字符串与 Client Hints:它们透露什么,又冻结了什么

浏览器指纹 · 阅读约 6 分钟 · 作者:PowerScan

图片:Unsplash

User-Agent 字符串是网络上最古老的识别信号,也是近几年变化最大的一个。要读懂它,就要知道其中还剩下什么、哪些被有意冻结,以及被移除的细节去了哪里。

字符串说了什么

Windows 上当前的 Chromium 字符串类似 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/154.0.0.0 Safari/537.36。其中的历史遗留标记(Mozilla/5.0、AppleWebKit、like Gecko、Safari)是为了兼容几十年前写的脚本,本身不携带任何信息。有用的部分是平台(Windows NT 10.0,即便在 Windows 11 上也是如此)、架构和浏览器主版本号。

过去存在的内容已被有意移除。次版本号和补丁版本号现在是 0.0.0。Windows 版本固定为 10.0。Android 字符串不再包含设备型号。这就是 Chromium 在 2022 年至 2023 年间推出的“User-Agent 缩减”,正是因为这个字符串已经成为一个指纹识别面。

Client Hints:同样的数据,按需提供

被移除的细节并没有消失,而是转移到了 User-Agent Client Hints。服务器可以通过 Accept-CH 标头请求特定字段,浏览器随后会在之后的请求中发送诸如 Sec-CH-UA-Platform-Version 或 Sec-CH-UA-Model 之类的标头。低熵提示(品牌与主版本号、平台、是否移动设备标志)默认发送。高熵提示(完整版本、架构、位数、型号、平台版本)只发送给提出请求的网站,脚本也可以通过 navigator.userAgentData.getHighEntropyValues() 请求同一组数据。

这种设计的目标是让网站必须声明它想要什么,从而使收集行为变得可见、可审计。实际上,想要做指纹识别的网站仍然可以索取全部内容;区别在于,这种索取是浏览器看得到、可以记录或拒绝的请求。

一致性问题

由于相同的事实现在可以从两个来源获得,它们就可以被拿来比对。一个把 User-Agent 字符串改成声称是 macOS,却让 navigator.userAgentData.platform 仍然报告 Windows 的浏览器,制造出了一个极易检测的矛盾。navigator.platform 属性、页面可见的操作系统专属字体,以及 WebGL 渲染器字符串(它所指的显卡驱动只存在于某一种操作系统上)也是如此。多年来,只伪造字符串一直是一种注定失败的策略。

查看你自己的

诊断工具会显示原始字符串、从中解析出的浏览器和版本,以及引擎(Blink、Gecko 或 WebKit)。请注意,iOS 上的所有浏览器无论品牌如何,报告的都是 WebKit,因为这是 Apple 的要求。如果解析出的浏览器名称让你意外,说明字符串被某个扩展或配置文件设置改动了;这是否成问题,取决于浏览器的其余部分是否与这种改动相符。

全部文章 · 开始扫描