为什么 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
我没有得到的是:
- 为什么具体是字符串“Not A Brand”?还有其他人使用这个 pseudo-UA 吗?这是某种笑话吗?
- 为什么字符串里面有
\"
和\A;
?我唯一的猜测是,这应该会以某种方式扰乱解析器(就像 CSS 中的 anti-IE hack),但这似乎是一个相当奇怪的目的——IIRC,\A
是钟字符.
- 这应该如何实现 user-agent 提示歧义,因为它 还 发送了完整的
user-agent
header,它具有具体版本号?
- 同时:为什么 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);
我明白 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
我没有得到的是:
- 为什么具体是字符串“Not A Brand”?还有其他人使用这个 pseudo-UA 吗?这是某种笑话吗?
- 为什么字符串里面有
\"
和\A;
?我唯一的猜测是,这应该会以某种方式扰乱解析器(就像 CSS 中的 anti-IE hack),但这似乎是一个相当奇怪的目的——IIRC,\A
是钟字符. - 这应该如何实现 user-agent 提示歧义,因为它 还 发送了完整的
user-agent
header,它具有具体版本号? - 同时:为什么 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);