为什么 Chrome 使用 sec-ch-ua: "\"Not\\A;Brand";v="99"?

Sai*_*Sai 39 user-agent privacy google-chrome client-hints

我知道使用户代理提示更加模糊的部分目的是为了使浏览器指纹识别更加困难。

我自己的(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
Run Code Online (Sandbox Code Playgroud)

我不明白的是:

  1. 为什么特别是字符串“Not A Brand”?还有其他人使用这个伪 UA 吗?这是某种玩笑吗?
  2. 为什么\"\\A;里面的字符串?我唯一的猜测是,这应该以某种方式与解析器混淆(就像 CSS 中的反 IE 黑客),但这似乎是一个相当奇怪的目的——而 IIRC,\A就是钟形字符。
  3. 鉴于它还发送user-agent具有特定版本号的完整标头,这应该如何实现用户代理提示歧义?
  4. 同时:为什么 Chrome 的用户代理还声称是 Mozilla、AppleWebKit 和 Safari?不是,而且这个user-agent字符串是 Chrome 特有的。它是否有来自其他浏览器的某种嵌入式组件?

wil*_*l93 31

这似乎是 Chromium GREASEing策略的一部分:

包含多个条目的用户代理品牌可以鼓励对 UA 字符串进行标准化处理。通过随机包含额外的、故意不正确的、以任意顺序使用逗号分隔的条目,它们将减少我们在一些必需的字符串上僵化的机会


查看 Chromium 仓库,好像是在这个 commit 中引入的

给出的提交描述是:

[client-hints] GREASEing the Sec-CH-UA list

Randomizing order and string with escaped characters to ensure proper
parsing and prevent ossification.
Run Code Online (Sandbox Code Playgroud)

它还链接到错误跟踪器中的此票证

  • 这可能有点偏离主题,但这感觉很像 Golang 有时所做的,以确保人们不依赖“不保证”的行为。例如:地图上的迭代顺序是“故意不可预测的”,只是为了迫使程序员不依赖特定的顺序。请参阅 https://github.com/golang/go/issues/6719 (8认同)
  • 根据提交消息,我想说转义字符的存在只是为了确保最终解析 UA 的人将被迫正确实现 UA 字符串中可能发生的所有“情况”。 (6认同)
  • 有*一些*错误的条目,例如“不是一个品牌”,将实现您大胆的目标。但这并不能解释为什么他们专门称其为“不是品牌”,也不能解释为什么逃脱的角色。找到该提交做得很好,但它的消息也没有真正解释这些(票证也没有)。因此我的OP中提出了具体问题。 (4认同)