HTTP Content-Security-Policy 是按页面设置还是按 GET 设置?

Is HTTP Content-Security-Policy set per page or per GET?

我的问题类似于,但不相同:

但我认为那里没有明确的答案。

加载网页时,该页面(以及该页面加载的任何资源)的内容安全策略 (CSP) 是否由遇​​到的第一个 CSP header 定义,或者是否可以由该页面加载的后续资源?

例子

假设位于 https://www.example.com/main.html returns 的网页是一个 CSP header

Content-Security-Policy: script-src https://safe.javascript.com

然后在其 HTML 中从 safe.javascript.com:

请求一个 Javascript 文件
<script src='https://safe.javascript.com/magnifier.js</script>

浏览器基于 CSP header 允许此来源,并在页面加载期间向 safe.javascript.com 发出 HTTP/GET 请求 magnifier.js。 但是,让我们假设 Javascript 文件本身的 HTTP 响应 headers 包含一个 CSP header:

Content-Security-Policy: script-src https://unsafe.javascript.com

关于脚本源,main.html 网页的 CSP 现在设置为什么?

我认为后者是安全的选择,但除了

我在https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP中找不到答案

Configuring Content Security Policy involves adding the Content-Security-Policy HTTP header to a web page and giving it values to control what resources the user agent is allowed to load for that page.

'for that page' 是否意味着每页设置一次,并且仅由特定页面的 header 设置?

我看到网站为所有资源(例如图像,CSS)设置 CSP headers 而不仅仅是他们的 HTML 内容。但是除非内容是HTML,否则有什么目的吗?

CSP由页面定义,大多数子资源不需要指定CSP,因为它不会被使用,发送它很浪费字节。

原来的CSP可以指定strict-dynamic让允许的脚本添加新的脚本。但这仍然不能取代顶级 CSP。有关详细信息,请参阅此处:https://content-security-policy.com/strict-dynamic/