为什么 Chrome 会告诉我 CSP 'require-sri-for' 指令是在当前禁用的标志后面实现的?

信息安全 铬合金 内容安全策略 子资源完整性
2021-08-25 04:27:57

在我的内容安全政策中,我已包含require-sri-for script. 但是,在 Chrome 控制台中,我收到一条通知(不是错误,只是信息):

Content-Security-Policy 指令“require-sri-for”在当前禁用的标志后面实现。

据我可以解释这一点,它告诉我,我试图要求 SRI 用于无论如何都被禁用的东西。例如,如果我有:script-src 'none'那么有没有意义require-sri-for script,因为无论如何所有脚本都是不允许的。

但是,当我有script-src 'self'.

此通知的正确含义是什么?我需要做些什么来修复它?

3个回答

Chrome 告诉您它知道该指令,但浏览器当前配置为忽略它,无论是否应用它。

SRI(子资源完整性)作为W3C 建议,从 2016 年 6 月开始require-sri-for,但内容安全政策指令后来在2016 年 8 月的编辑草案中引入。草案仅供讨论,可能随时更改。并且默认情况下通常不会启用此类实验性功能,以便为实现、规范或两者的更改腾出空间。

每当 Chrome 在策略中发现该指令时,它会首先检查是否启用了实验性功能,如果是,将解析该指令及其值。如果未启用实验性功能,它将记录您看到的消息:

Content-Security-Policy 指令“require-sri-for”在当前禁用的标志后面实现。

即使稍后使用 禁用脚本,它也会报告该消息script-src 'none',该消息在解析指令时会提前登录到控制台。您可以在CSPDirectiveList::AddDirective方法的源代码中看到它。

要使消息消失,您有两种选择:

  1. 启用#enable-experimental-web-platform-features(将其chrome://flags/复制chrome://flags/#enable-experimental-web-platform-features并粘贴到您的 Chrome,重新启动浏览器),并测试您的策略,以便您在require-sri-for发货时做好准备,但这会使消息消失,只有一小部分启用了他们浏览器中的实验性功能

  2. 从您的策略中删除require-sri-for,例如如果您不需要它,因为您正在使用script-src 'none',然后在您想要验证脚本时将其添加回来

  3. 等到 Chrome 为所有人启用该功能,直到那时用户将在控制台中看到该消息,即使您没有验证加载脚本的完整性

我个人选择选项 3,但我暂时启用了该标志以查看该站点是否可以运行一次require-sri-for

这意味着该require-sri-for功能在chrome://flags. 但是,我一直无法找到启用此功能的相关标志。

Mozilla 文档指出require-sri-forv54 以来 Chrome 已支持,但是我已经测试了 Chrome 和 Chromium 的最新版本,但情况似乎并非如此。

这似乎是 Chrome 中的一个已知错误,目前没有修复。

编辑 2018-03-29:我已将接受的答案更改为 Michal Špaček 的 - 神秘标志是#enable-experimental-web-platform-features.

当浏览器供应商推出新功能时,他们通常首先将它们隐藏在标志后面。用户必须明确选择加入该功能才能使用它。这为供应商提供了一小部分用户来“试验”。chrome://flags在 Chrome 中,您可以在页面上找到标志。

因此,您收到的消息是告诉您此功能在 Chrome 中不可用,除非您激活它。查看该指令的Mozilla 页面,它应该在没有来自 Chrome 54 及更高版本的标志的情况下打开。Firefox 仍然需要一个标志,而 IE/Edge 根本没有实现它。

换句话说,require-sri-forCSP 指令为您的一些用户提供保护,但不是全部。但是,正如您自己指出的那样,如果您有script-src 'none'必要对无论如何都禁止的脚本要求 SRI 是没有意义的。