Chrome 124 包含用于放宽混合内容限制的专用网络访问权限功能。针对这项变更需要更多时间准备的网站的弃用试用正在进行中,但此试用会在 Chrome 126 结束,预计于 2024 年 9 月 4 日发布。此博文介绍了具体变化,并详细介绍了该功能的设计、如何迁移当前网站以及如何测试您的实现。
有何变化?
为了与专用网络上的设备建立连接,因为相应设备由于不具备全局唯一名称而无法获得 TLS 证书,此功能为 fetch()
引入了一个新选项,用于声明开发者与此类设备通信的意图。其中包括由政策控制的新功能(用于限制每个网站对此功能的访问),以及用于服务器预检响应的新标头(用于提供额外的元数据)。
什么是专用网络访问?
专用网络访问(PNA,以前称为 CORS-RFC1918,简称为本地网络访问)是一项安全功能,用于限制网站向专用网络上的服务器发送请求的能力。这有助于保护用户和内部网络免受跨站请求伪造 (CSRF) 等潜在攻击的侵害。Chrome 已在逐步实现 PNA,并且在未来版本中将扩展保护功能。
为什么需要权限提示?
Chrome 94 引入了禁止从不安全的公共网站访问专用网络的功能。我们正在进行的 基于非安全上下文的专用网络访问功能的弃用试验表明,在将受影响的网站迁移到 HTTPS 时存在挑战。一个常见的担忧是难以将专用设备迁移到 HTTPS,导致混合内容检查违规。
为了解决此质询,Chrome 120 中的源试用以及 Chrome 124 的稳定版中添加了新的权限提示。
在什么情况下需要权限提示?
我们计划在权限提示功能推出几个里程碑后结束非安全上下文弃用试用。为了确保兼容性,您必须将公共网站迁移到 HTTPS。如果您无法将专用服务器迁移到 HTTPS,可以通过新的权限提示功能放宽混合内容检查。
带有权限提示的专用网络访问请求的典型工作流如下。
触发权限提示
将新的 targetAddressSpace
属性添加为提取选项,这样请求就可以跳过混合内容检查。
fetch("http://router.local/ping", {
targetAddressSpace: "private",
});
根据专用网络访问:引入预检,任何专用网络请求都会先于预检请求。此预检请求将包含新标头 Access-Control-Request-Private-Network: true
,而相应的响应必须包含标头 Access-Control-Allow-Private-Network: true
。
为了适应新的权限提示,设备必须整合两个新的响应标头:Private-Network-Access-Name
和 Private-Network-Access-ID
。
Private-Network-Access-ID
:以 6 个十六进制字节表示的 48 位值,以英文冒号分隔。Private-Network-Access-Name
:与 ECMAScript 正则表达式/^[a-z0-9_-.]+$/.
匹配的字符串形式的有效名称。名称的最大长度为 248 个 UTF-8 代码单元。
Private-Network-Access-Name: "My Smart Toothbrush"
Private-Network-Access-ID: "01:23:45:67:89:0A"
演示
您可以通过以下网址查看演示:https://private-network-access-permission-test.glitch.me/。
您需要启动个人专用服务器才能使用演示网站。专用服务器应使用 HTTP 标头 Access-Control-Allow-Private-Network: true
以及服务器指定的标头 Private-Network-Access-ID
和 Private-Network-Access-Name
进行响应。如果一切设置正确,应显示以下权限提示:
退出非安全上下文弃用试用
对于已注册针对非安全上下文的专用网络访问权限弃用试用的网站,此时您可以使用我们的新权限提示迁移网站并立即退出试用。
更新代码后,删除 HTML、JavaScript 或 HTTP 标头中的试用令牌。如果您不记得将试用令牌放在什么位置,请参阅上一篇博文中的“注册弃用试用版”部分。
您可能还需要在试用页面中删除相应令牌。
后续操作
针对来自非 API fetch()
的请求的解决方案仍在探索中。
我们已经测试了多种解决方案,例如,使用 Service Worker 或将目标地址空间作为新的内容安全政策。不过,来自非 API fetch()
的请求的最终形状仍在研究中。
将来,通过权限政策可能会支持来自子框架的请求。
将来,我们可能需要支持权限政策,以放宽子框架的功能。
针对专用网络用例的反馈
如果您在专用网络上托管了一个需要来自公共网络的请求的网站,Chrome 团队期待您的反馈!请在 Chromium 问题跟踪器(组件:Blink>SecurityFeature>CORS>PrivateNetworkAccess)或 GitHub 代码库中提交问题。