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

Why does Chrome use sec-ch-ua: "\"Not\\A;Brand";v="99"?

我明白 user-agent hints more ambiguous is intended, in part, to make browser fingerprinting 更难了。

我自己的(Windows 桌面)Chrome 发送 headers:

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

我没有得到的是:

  1. 为什么具体是字符串“Not A Brand”?还有其他人使用这个 pseudo-UA 吗?这是某种笑话吗?
  2. 为什么字符串里面有\"\A;?我唯一的猜测是,这应该会以某种方式扰乱解析器(就像 CSS 中的 anti-IE hack),但这似乎是一个相当奇怪的目的——IIRC,\A 是钟字符.
  3. 这应该如何实现 user-agent 提示歧义,因为它 发送了完整的 user-agent header,它具有具体版本号?
  4. 同时:为什么 Chrome 的 user-agent 也声称是 Mozilla、AppleWebKit 和 Safari?它不是,这个 user-agent 字符串明显是 Chrome 的。它是否有来自其他浏览器的某种嵌入式组件?

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

User agents' brands containing more than a single entry could encourage standardized processing of the UA string. By randomly including additional, intentionally incorrect, comma-separated entries with arbitrary ordering, they would reduce the chance that we ossify on a few required strings.


查看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

如果有人正在寻找 Chromium\Cefsharp 的解决方案,这里是如何全局禁用此 headers 的方法:

Cefsharp(C# 代码):

var settings = new CefSettings();
settings.CefCommandLineArgs.Add("disable-features", "UserAgentClientHint");
Cef.InitializeAsync(settings);