问题描述
我知道使user-agent hints更加模棱两可的部分目的是使browser fingerprinting更加困难。
我自己的(Windows桌面)Chrome发送标头:
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/86.0.4240.75 Safari/537.36
sec-ch-ua: "Chromium";v="86","\"Not\\A;Brand";v="99","Google Chrome";v="86"
sec-ch-ua-mobile: ?0
我没有得到的是:
- 为什么特别要使用字符串“ Not A Brand”?是否还有其他人使用此伪UA?这是个玩笑吗?
- 为什么在字符串中使用
\"
和\\A;
?我唯一的猜测是,它应该以某种方式与解析器混淆(例如CSS中的反IE hacks),但这似乎是一个很奇怪的目的— IIRC,\A
是响铃字符。 - 假设还发送完整的
user-agent
标头(具有特定的版本号),这应该如何实现用户代理提示的歧义? - 与此同时:为什么Chrome的用户代理还声称是Mozilla,AppleWebKit和Safari?并非如此,并且此
user-agent
字符串是Chrome的独特字符串。它是否具有其他浏览器提供的某种嵌入式组件?
解决方法
这似乎是Chromium的GREASEing策略的一部分:
包含多个条目的用户代理品牌可能会鼓励对UA字符串进行标准化处理。通过随机包含其他,有意不正确的,以任意顺序排序的逗号分隔条目,它们将减少我们在一些必需的字符串上僵化的机会。
查看Chromium存储库,它似乎是在this commit
中引入的给出的提交描述是:
[client-hints] GREASEing the Sec-CH-UA list
Randomizing order and string with escaped characters to ensure proper
parsing and prevent ossification.
它还链接到错误跟踪器中的this ticket。