内容安全策略 (CSP) 标头
Baseline 广泛可用 *
HTTP Content-Security-Policy
响应标头允许网站管理员控制用户代理被允许为给定页面加载的资源。除少数例外,策略主要涉及指定服务器来源和脚本端点。这有助于防范跨站点脚本攻击。
有关 CSP 如何传递到浏览器、其外观以及用例和部署策略的详细信息,请参阅内容安全策略 (CSP) 指南。
语法
Content-Security-Policy: <policy-directive>; <policy-directive>
其中 <policy-directive>
由以下内容组成:<directive> <value>
,无内部标点符号。
指令
Fetch 指令
Fetch 指令控制可以从哪些位置加载特定资源类型。
child-src
-
定义使用
<frame>
和<iframe>
等元素加载的Web Worker 和嵌套浏览上下文的有效源。frame-src
和worker-src
的回退。 connect-src
-
限制可以使用脚本接口加载的 URL。
default-src
-
作为其他fetch 指令的回退。
所有其他 fetch 指令的回退。
fenced-frame-src
实验性-
指定加载到
<fencedframe>
元素中的嵌套浏览上下文的有效源。 font-src
-
指定使用
@font-face
加载的字体的有效源。 frame-src
img-src
-
指定图像和网站图标的有效源。
manifest-src
-
指定应用程序清单文件的有效源。
media-src
object-src
prefetch-src
已弃用 非标准-
指定要预取或预渲染的有效源。
script-src
-
指定 JavaScript 和 WebAssembly 资源的有效源。
script-src-elem
和script-src-attr
的回退。 script-src-elem
-
指定 JavaScript
<script>
元素的有效源。 script-src-attr
-
指定 JavaScript 内联事件处理程序的有效源。
style-src
-
指定样式表的有效源。
style-src-elem
和style-src-attr
的回退。 style-src-elem
style-src-attr
-
指定应用于单个 DOM 元素的内联样式的有效源。
worker-src
-
指定
Worker
、SharedWorker
或ServiceWorker
脚本的有效源。
所有 fetch 指令都可以指定为单个值 'none'
,表示应完全阻止特定资源类型,或指定为一个或多个源表达式值,表示该资源类型的有效源。有关详细信息,请参阅Fetch 指令语法。
回退
某些 fetch 指令充当其他更细粒度指令的回退。这意味着如果未指定更细粒度的指令,则使用回退为该资源类型提供策略。
default-src
是所有其他 fetch 指令的回退。script-src
是script-src-attr
和script-src-elem
的回退。style-src
是style-src-attr
和style-src-elem
的回退。child-src
是frame-src
和worker-src
的回退。
例如
- 如果省略
img-src
但包含default-src
,则由default-src
定义的策略将应用于图像。 - 如果省略
script-src-elem
但包含script-src
,则由script-src
定义的策略将应用于<script>
元素。 - 如果
script-src-elem
和script-src
都省略,但包含default-src
,则由default-src
定义的策略将应用于<script>
元素。
文档指令
文档指令控制应用策略的文档或 工作器环境的属性。
导航指令
导航指令控制用户可以导航或提交表单的位置,例如。
form-action
-
限制可用于给定上下文的表单提交目标的 URL。
frame-ancestors
报告指令
报告指令控制 Content-Security-Policy
和 Content-Security-Policy-Report-Only
中 CSP 违规报告的目标 URL。
report-to
-
向浏览器提供一个令牌,用于识别向其发送 CSP 违规信息的报告端点或端点组。令牌所代表的端点通过其他 HTTP 标头提供,例如
Reporting-Endpoints
和Report-To
已弃用 。警告:此指令旨在替换
report-uri
;在支持report-to
的浏览器中,report-uri
指令将被忽略。但是,在report-to
获得广泛支持之前,您应该同时指定这两个标头(其中endpoint_name
是单独提供的端点的名称),如下所示:httpContent-Security-Policy: …; report-uri https://endpoint.example.com; report-to endpoint_name
其他指令
require-trusted-types-for
-
在 DOM XSS 注入点强制执行 Trusted Types。
trusted-types
-
用于指定 Trusted Types 策略的允许列表。Trusted Types 允许应用程序锁定 DOM XSS 注入点,只接受不可伪造的类型化值而非字符串。
upgrade-insecure-requests
-
指示用户代理将网站所有不安全的 URL(通过 HTTP 提供)视为已替换为安全 URL(通过 HTTPS 提供)。此指令适用于具有大量不安全旧式 URL 且需要重写的网站。
已弃用的指令
block-all-mixed-content
已弃用-
当页面使用 HTTPS 加载时,阻止使用 HTTP 加载任何资产。
report-uri
已弃用-
向浏览器提供一个 URL,应将 CSP 违规报告发送到该 URL。此功能已被
report-to
指令取代。
Fetch 指令语法
所有 fetch 指令都可以指定为以下其中一种:
- 单个值
'none'
,表示应完全阻止特定资源类型 - 一个或多个源表达式值,表示该资源类型的有效源。
每个源表达式采用下面列出的形式之一。请注意,并非所有形式都适用于所有 fetch 指令:请参阅每个 fetch 指令的文档以了解哪些形式适用于它。
<host-source>
和 <scheme-source>
格式必须不带引号,所有其他格式必须用单引号括起来。
'nonce-<nonce_value>'
此值由字符串 nonce-
后跟一个 nonce 值组成。nonce 值可以使用 Base64 或 URL 安全 Base64 中的任何字符。
此字符串是服务器为每个 HTTP 响应生成的随机值。例如:
'nonce-416d1177-4d12-4e3b-b7c9-f6c409789fb8'
然后,服务器可以将相同的值作为任何打算从文档加载的 <script>
或 <style>
资源的 nonce
属性的值包含在内。
浏览器将 CSP 指令中的值与元素属性中的值进行比较,并且仅当它们匹配时才加载资源。
如果指令包含 nonce 和 unsafe-inline
,则浏览器将忽略 unsafe-inline
。
有关更多用法信息,请参阅 CSP 指南中的Nonces。
'<hash_algorithm>-<hash_value>'
此值由一个标识哈希算法的字符串,后跟 -
,再后跟一个哈希值组成。哈希值可以使用 Base64 或 URL 安全 Base64 中的任何字符。
- 哈希算法标识符必须是
sha256
、sha384
或sha512
之一。 - 哈希值是 哈希 的 base64 编码,它是使用以下哈希函数之一计算的
<script>
或<style>
资源:SHA-256、SHA-384 或 SHA-512。
例如
'sha256-cd9827ad...'
当浏览器接收到文档时,它会哈希任何 <script>
和 <style>
元素的内容,将结果与 CSP 指令中的任何哈希进行比较,并且仅当匹配时才加载资源。
如果元素加载外部资源(例如,使用 src
属性),则该元素还必须设置 integrity
属性。
如果指令包含哈希和 unsafe-inline
,则浏览器将忽略 unsafe-inline
。
有关更多用法信息,请参阅 CSP 指南中的哈希。
<host-source>
方案、端口号和路径是可选的。
如果省略方案,则使用文档源的方案。
在匹配方案时,允许安全升级。例如:
http://example.com
也将允许来自https://example.com
的资源ws://example.org
也将允许来自wss://example.org
的资源。
通配符 ('*'
) 可用于子域、主机地址和端口号,表示它们的任何合法值都有效。例如:
http://*.example.com
允许来自example.com
任何子域的资源,通过 HTTP 或 HTTPS。
以 /
结尾的路径匹配它们作为前缀的任何路径。例如:
example.com/api/
将允许来自example.com/api/users/new
的资源。
不以 /
结尾的路径将精确匹配。例如:
https://example.com/file.js
允许来自https://example.com/file.js
的资源,但不允许来自https://example.com/file.js/file2.js
的资源。
<scheme-source>
一个方案,例如 https:
。冒号是必需的。
允许安全升级,因此
http:
也将允许使用 HTTPS 加载的资源ws:
也将允许使用 WSS 加载的资源。
'self'
给定类型的资源只能从与文档相同的源加载。
允许安全升级。例如:
- 如果文档是从
http://example.com
提供的,则'self'
的 CSP 也将允许来自https://example.com
的资源。 - 如果文档是从
ws://example.org
提供的,则'self'
的 CSP 也将允许来自wss://example.org
的资源。
'unsafe-eval'
默认情况下,如果 CSP 包含 default-src
或 script-src
指令,则禁用将参数评估为 JavaScript 的 JavaScript 函数。这包括 eval()
、setTimeout()
的 code
参数或 Function()
构造函数。
unsafe-eval
关键字可用于取消此保护,允许将字符串动态评估为 JavaScript。
警告:开发者应避免使用 'unsafe-eval'
,因为它会破坏 CSP 的大部分目的。
有关更多用法信息,请参阅 CSP 指南中的eval()
和类似 API。
'wasm-unsafe-eval'
默认情况下,如果 CSP 包含 default-src
或 script-src
指令,则页面将不允许使用 WebAssembly.compileStreaming()
等函数编译 WebAssembly。
wasm-unsafe-eval
关键字可用于取消此保护。这是一种比 'unsafe-eval'
更安全的替代方案,因为它不会启用 JavaScript 的通用评估。
'unsafe-inline'
默认情况下,如果 CSP 包含 default-src
或 script-src
指令,则不允许执行内联 JavaScript。这包括
- 内联
<script>
标签 - 内联事件处理程序属性
javascript:
URL。
同样,如果 CSP 包含 default-src
或 style-src
指令,则不会加载内联 CSS,包括
- 内联
<style>
标签 style
属性。
unsafe-inline
关键字可用于取消此保护,允许加载所有这些形式。
警告:开发者应避免使用 'unsafe-inline'
,因为它会破坏 CSP 的大部分目的。
有关更多用法信息,请参阅 CSP 指南中的内联 JavaScript。
'unsafe-hashes'
默认情况下,如果 CSP 包含 default-src
或 script-src
指令,则不允许执行 onclick
等内联事件处理程序属性和内联 style
属性。
'unsafe-hashes'
表达式允许浏览器对内联事件处理程序和 style
属性使用哈希表达式。例如,CSP 可能包含这样的指令
script-src 'unsafe-hashes' 'sha256-cd9827ad...'
如果哈希值与内联事件处理程序属性值或 style
属性值的哈希匹配,则允许执行代码。
警告:'unsafe-hashes'
值是不安全的。
特别是,它启用了一种攻击,其中内联事件处理程序属性的内容作为内联 <script>
元素注入到文档中。假设内联事件处理程序是
<button onclick="transferAllMyMoney()">Transfer all my money</button>
如果攻击者可以注入包含此代码的内联 <script>
元素,则 CSP 将自动允许其执行。
但是,'unsafe-hashes'
比 'unsafe-inline'
安全得多。
'inline-speculation-rules'
默认情况下,如果 CSP 包含 default-src
或 script-src
指令,则不允许执行内联 JavaScript。'inline-speculation-rules'
允许浏览器加载具有 type
属性为 speculationrules
的内联 <script>
元素。
有关详细信息,请参阅 Speculation Rules API。
'strict-dynamic'
'strict-dynamic'
关键字使得通过 nonce 或 哈希 授予脚本的信任扩展到此脚本动态加载的脚本,例如通过使用 Document.createElement()
创建新的 <script>
标签,然后使用 Node.appendChild()
将它们插入到文档中。
如果此关键字存在于指令中,则以下所有源表达式值都将被忽略
有关更多用法信息,请参阅 CSP 指南中的strict-dynamic
关键字。
'report-sample'
如果此表达式包含在控制脚本或样式的指令中,并且该指令导致浏览器阻止任何内联脚本、内联样式或事件处理程序属性,则浏览器生成的违规报告将包含一个sample
属性,其中包含被阻止资源的前 40 个字符。
工作器中的 CSP
工作器通常不受创建它们的文档(或父工作器)的内容安全策略的约束。要为工作器指定内容安全策略,请为请求工作器脚本本身的请求设置 Content-Security-Policy
响应标头。
此规则的例外情况是,如果工作器脚本的来源是全局唯一标识符(例如,如果其 URL 的方案是数据或 blob)。在这种情况下,工作器确实继承了创建它的文档或工作器的内容安全策略。
多个内容安全策略
CSP 机制允许为资源指定多个策略,包括通过 Content-Security-Policy
标头、Content-Security-Policy-Report-Only
标头和 <meta>
元素。
您可以多次使用 Content-Security-Policy
标头,如以下示例所示。此处请特别注意 connect-src
指令。即使第二个策略允许连接,第一个策略也包含 connect-src 'none'
。添加其他策略只能进一步限制受保护资源的功能,这意味着不允许任何连接,并且作为最严格的策略,将强制执行 connect-src 'none'
。
Content-Security-Policy: default-src 'self' http://example.com;
connect-src 'none';
Content-Security-Policy: connect-src http://example.com/;
script-src http://example.com/
示例
禁用不安全的内联代码并只允许 HTTPS 资源
此 HTTP 标头将默认策略设置为仅允许通过 HTTPS 加载资源(图像、字体、脚本等)。由于未设置 unsafe-inline
和 unsafe-eval
指令,因此内联脚本将被阻止。
Content-Security-Policy: default-src https:
可以使用 HTML <meta>
元素应用相同的限制。
<meta http-equiv="Content-Security-Policy" content="default-src https:" />
允许内联代码和 HTTPS 资源,但禁用插件
此策略可用于使用过多内联代码且无法修复的现有站点,以确保资源仅通过 HTTPS 加载并禁用插件
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'
在测试时报告但不强制执行违规
此示例设置了与上一个示例相同的限制,但使用了 Content-Security-Policy-Report-Only
标头和 report-to
指令。此方法在测试期间用于报告违规但不阻止代码执行。
用于发送报告的端点(URL)使用 Reporting-Endpoints
HTTP 响应标头定义。
Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"
然后,在 CSP 策略中使用 report-to
指令选择特定的端点作为报告目标。
Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-url/; report-to csp-endpoint
请注意,上面也指定了 report-uri
已弃用 指令,因为 report-to
尚未被浏览器广泛支持。
有关更多示例,请参阅内容安全策略 (CSP) 实现。
规范
规范 |
---|
内容安全策略级别 3 # csp-header |
浏览器兼容性
加载中…