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

98
我理解用户代理提示更加模糊的目的在于增加浏览器指纹识别的难度。
我的Chrome浏览器(Windows桌面版)发送以下头部信息:
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"?还有其他人使用这个伪UA吗?这是某种玩笑吗?
  2. 为什么在字符串内部使用\"\\A;?我唯一的猜测是这可能会与解析器产生干扰(就像CSS中的反IE hack一样),但这似乎是一个相当奇怪的目的 - 而且我IRC,\A是响铃字符。
  3. 既然它还发送完整的user-agent头,其中包含具体的版本号,那么这又如何实现用户代理提示模棱两可呢?
  4. 顺便问一下:为什么Chrome的用户代理还声称自己是Mozilla、AppleWebKit和Safari?它不是,而这个user-agent字符串是独特的Chrome的。它是否具有来自那些其他浏览器的嵌入式组件?

1
针对你问题中的第二点进行评论:我怀疑 \" 会被反转义为 "\\ 会被反转义为 \,所以响铃字符 \A 没有被解析。 - William
关于第三点,请参见https://groups.google.com/a/chromium.org/g/blink-dev/c/-2JIRNMWJ7s/m/yHe4tQNLCgAJ,计划冻结和清理用户代理。 - Arye Eidelman
关于第四点,请参见 https://web.dev/user-agent-client-hints/#background 每个新的浏览器出于兼容性原因都必须复制现有的用户代理,然后添加有关自身及其版本等新信息。 - Arye Eidelman
1
我现在要开始自己的品牌,叫做“非品牌”! - undefined
1个回答

84

看起来这是Chromium的GREASEing策略的一部分:

包含多个条目的用户代理品牌可能会鼓励UA字符串的标准化处理。通过随机包含附加的、故意不正确的、逗号分隔的条目,带有任意顺序,它们将减少我们对少数必需字符串进行硬编码的机会


查看Chromium存储库,似乎是在此提交中引入的。

给出的提交说明为:

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

Randomizing order and string with escaped characters to ensure proper
parsing and prevent ossification.

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


10
在你强调的目标中加入一些错误条目,例如“非品牌”,可以实现目标。但这并不能解释为什么他们具体称之为“非品牌”,也不能解释为什么要使用转义字符。很高兴你找到了那个提交,但它的信息也没有解释这些问题(票务系统也没有)。因此在我的原帖中有具体的问题。 - Sai
12
根据提交记录,我会说转义字符的存在只是为了确保最终解析UA的人将被迫正确实现在UA字符串中可能发生的所有“情况”。 - William
28
这可能和主题有点偏离,但这感觉很像 Golang 偶尔会做的事情,以确保人们不依赖于“不保证”的行为。例如:故意使 map 的迭代顺序是不可预测的,只是为了强制程序员不要依赖于特定的顺序。请参见 https://github.com/golang/go/issues/6719。 - William
1
有趣的一点是将其用作案例测试。这是一个人可能会做的事情;我没有想到允许的字符串内容是什么,以至于人们可能想要模糊它。那似乎是一个相当不错的答案。 - Sai
我理解得对吗?为了让消费者不使用严格的Chromium版本枚举,因为它们可能会自发地改变,他们采用了随机填充的命名策略来使其随机化。如果每个新版本都带有一个新的模式,这难道不会使指纹识别和跟踪变得更容易吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接