当 Content-Security-Policy 同时出现在 HTTP header 和元标记中时出现问题

Issue when Content-Security-Policy is present in both HTTP header and a meta tag

我们正在开发一个 Web 项目,其中通过 HTTP headers 和元标记强制执行内容安全策略。有一组默认属性是 HTTP header 的一部分,每个页面通过文档 header 中的元标记指定附加策略。

项目中的一个页面在 iframe 中加载内容。该页面的 HTTP header 中的 Content-Security-Policy 是

Content-Security-Policy: frame-src *;

并且该页面的文档中包含以下元标记 header

<meta http-equiv="Content-Security-Policy" content="default-src none;"/>

MDN Web Docs中提到回退顺序为frame-src -> child-src -> default-src。 In-spite 在 HTTP header 中设置 frame-src,我在浏览器控制台中收到以下错误消息(在 Google Chrome 和 Microsoft Edge 上试过):

Refused to frame '<url here>' because it violates the following Content Security Policy directive: "default-src none". Note that 'frame-src' was not explicitly set, so 'default-src' is used as a fallback.

此外,

Moving both the policies either to the HTTP header or to the meta tag works as expected

Content Security Policy 上 frame-src 上面的更一般的页面解释了您所看到的内容:

Multiple content security policies

CSP allows multiple policies being specified for a resource, including via the Content-Security-Policy header, the Content-Security-Policy-Report-Only header and a <meta> element.

You can use the Content-Security-Policy header more than once... Adding additional policies can only further restrict the capabilities of the protected resource.

所以对于多个 CSP,就好像 他们都在玩 不是 ,正如你所希望的那样,他们是合并为一项综合政策。因此,在您的示例中,您有效地将 frame-src 设置为 none(因为您有 default-src 并且没有针对 frame-src 的特定覆盖),因此稍后打开它不起作用。