为 Chrome 的用户代理减少功能做好准备

Chrome 会继续减少在其用户代理字符串中分享的信息,以帮助保护用户的隐私。

自 Chrome 110(2023 年 2 月)起,我们将逐步推出 Android 版本和设备型号的固定值,即型号 K 的默认值将始终为 Android 10。 如果您依靠用户代理检测访问者的操作系统版本、Android 设备型号或详细的浏览器版本,那么您可能需要采取措施(详情请见下文)。

user-agent(用户代理)是一个字符串,可提供有关用户浏览器及其环境的信息,例如获知您网站的访问者在 Android 设备上运行的是 Chrome 110 版本。 您的浏览器在 HTTP 标头中发送此请求,并通过 JavaScript 提供此标头。

完整的用户代理字符串存在的问题是,默认情况下,它在每次请求时都会分享有关浏览器的详细信息,这是允许跨网站跟踪的一个主要因素。 我们的目标是减少被动收集这些数据的机会,同时提供 API,让您能够在需要时主动访问数据。

到目前为止减少了用户代理

我们已经开始删除一些默认提供的用户代理数据,并用固定值取而代之。

Chrome 101 开始,我们将次要版本号替换为零,例如Chrome/101.3.2.1 已变为 Chrome/101.0.0.0

Chrome 107 开始,我们将桌面设备操作系统版本和 CPU 信息替换为平台的固定值。

MacMacintosh;Intel Mac OS X 10_15_7
WindowsWindows NT 10.0;Win64;x64
ChromeOSX11;CrOS x86_64 14541.0.0
LinuxX11;Linux x86_64

修复了从 Chrome 110 开始的 Android 版本和设备型号

Chrome 110 开始,我们会逐步推出针对 Android 版本和设备型号的固定值。 而不会在 Pixel 7 中看到类似 Android 13 的内容,而模型 K 上的默认值将始终为 Android 10

之前:用户代理包含 Android 版本和设备型号

Mozilla/5.0(Linux;Android 13Pixel 7)AppleWebKit/537.36(KHTML,例如 Gecko)Chrome/95.0.0.0 Mobile Safari/537.36

修复后:通过修复的 Android 版本和设备型号减少用户代理

Mozilla/5.0(Linux;Android 10K)AppleWebKit/537.36(KHTML,例如 Gecko)Chrome/95.0.0.0 Mobile Safari/537.36

用户代理格式没有变化

用户代理缩减会更改用户代理中返回的,但格式保持不变。 如果您只使用用户代理读取操作系统类型或主要浏览器版本,相关数据将会像以前一样继续更新,而您无需执行任何操作

用户代理字符串的平台、浏览器名称、浏览器主要版本和移动指示器部分会继续像以前一样更新。
操作系统类型、设备型号和浏览器次要版本为静态值。
用户代理字符串的所有其他部分均保持不变。

用户代理的替代方案

如果您目前使用的确实是更详细的数据,建议您最好确认一下是否可以使用渐进式增强功能或功能检测

请务必谨记,用户代理与其他任何用户提供的值一样 - 您应该对其进行验证,而不是假定该值准确无误。 用户、扩展程序或其他客户端可以轻松更改用户代理值,或者根本不会发送。 在大多数情况下,您应该能够在没有用户代理数据的情况下向访问者传送有效内容

使用用户代理客户端提示请求详细数据

访问详细的用户代理数据的原因有很多,例如提供设备特定内容、防欺诈功能或精细的日志记录。 如果您确实需要更详细的数据,可以使用 User-Agent Client Hints (UA-CH) API 来访问。 与 user-agent 类似,UA-CH 也可通过 HTTP 标头或 JavaScript 获取。

您可能已经看到了,默认标头使用 Sec-CH-UA- 前缀发送,这些前缀可以告诉您浏览器、主要版本、操作系统以及浏览器是否为移动设备。

来自 Chrome 的默认用户代理客户端提示请求标头

Sec-CH-UA: "Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Platform: "Android"

您可以在响应中使用 Accept-CH 标头来要求提供更多数据。 在这种情况下,您可以请求 Sec-CH-UA-Platform-VersionSec-CH-UA-Model,以在后续请求中返回相应的 Android 版本和设备类型。

来自服务器的响应标头(用于指定平台版本和型号)

Accept-CH:
  Sec-CH-UA-Platform-Version,
  Sec-CH-UA-Model

从 Chrome 请求返回的标头(包括 Android 版本和型号名称)

Sec-CH-UA-Platform-Version: "13.0.0"
Sec-CH-UA-Model: "Pixel 7"

在 JavaScript 中,您可以通过对 userAgentData API 调用 getHighEntropyValues() 并传入所需值(platformVersionmodel)数组来执行相同的操作。 这将返回一个 promise,其中包含包含特定值的对象。

navigator.userAgentData
 .getHighEntropyValues(
   ['platformVersion', 'model']
 ).then(ua => { console.log(ua)
 });

{
  "platformVersion": "13.0.0",
  "model": "Pixel 7"
}

跨源或初始请求

如果您的网页上有跨源资源需要这些值,您可以通过 Permissions-Policy HTTP 标头或在 HTML 中使用 Delegate-CH 元标记允许访问。

如果您的网站有必要在第一个顶级请求中包含这些敏感值,则可以使用 Critical-CH HTTP 标头,它会告知浏览器添加这些额外提示后重试其初始请求。 这对于难以更新的旧系统可能很有用,但理想情况下,您不应依赖这些敏感值来提供初始 HTML。

了解详情

要了解经过缩减的用户代理字符串的实际应用,请查看以下内容:

  • 请访问 goo.gle/reduced-ua-demo,查看适用于您设备的简化用户代理字符串
  • 请访问 goo.gle/ua-ch-demo 查看适用于您设备的所有 JavaScript 和 HTTP 标头用户代理客户端提示
  • 启用 #reduce-user-agent Chrome flag,在您的浏览器中发送经过缩减的用户代理字符串。

您仍然可以注册参与“用户代理缩减源站的试用”,以便在您的网站上获得缩减版用户代理。不过,我们将在 3 月初结束此试用,因为我们会继续逐步扩大默认发送缩减版用户代理的期限。

我们在用户代理缩减着陆页上提供了更多资源,您也可以在我们专用的 user-agent-reduction GitHub 代码库中提交问题。