Content-Security-Policy (CSP)

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since August 2016.

* Some parts of this feature may have varying levels of support.

HTTP 响应标头 Content-Security-Policy 允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定源服务器和脚本端点。这将帮助防止跨站脚本攻击

参见内容安全策略(CSP),以查看 CSP 发送到浏览器的细节,它长什么样,及其用例和部署策略。

标头类型 响应标头
禁止修改的标头

语法

http
Content-Security-Policy: <policy-directive>; <policy-directive>

其中 <policy-directive> 应为不含标点的 <directive> <value> 形式。

指令

Fetch 指令

Fetch 指令控制指定资源类型可以从哪里加载。

child-src

Web Worker 和其他嵌套浏览上下文(例如用 <frame><iframe> 加载到页面的内容)指定合法源。

frame-srcworker-src后备值

connect-src

限制能通过脚本接口加载的 URL。

default-src

为其他 Fetch 指令提供后备值。

其他所有 Fetch 指令的后备值

fenced-frame-src 实验性

指定可以加载到 <fencedframe> 元素的内嵌浏览器内容的合法源。

font-src

指定通过 @font-face 加载字体的合法源。

frame-src

为加载到 <frame><iframe> 等元素中的嵌套浏览上下文指定合法源。

img-src

指定图片和图标的合法源。

manifest-src

指定应用程序清单文件的合法源。

media-src

指定通过 <audio><video><track> 标签加载的媒体文件的合法源。

object-src

指定 <object><embed> 标签的合法源。

prefetch-src 已弃用 非标准

指定预加载或预渲染的合法源。

script-src

指定 JavaScript 或 WebAssembly 的合法源。

script-src-elemscript-src-attr后备值

script-src-elem

指定 JavaScript <script> 元素的合法源。

script-src-attr

指定 JavaScript 内联事件处理器的合法源。

style-src

指定层叠样式表文件的合法源。

style-src-elemstyle-src-attr后备值

style-src-elem

为带有 rel="stylesheet" 的样式表 <style> 元素和 <link> 元素指定合法源。

style-src-attr

指定单个 DOM 元素的行内样式的合法源。

worker-src

指定 WorkerSharedWorkerServiceWorker 脚本的合法源。

所有 Fetch 指令可以指定一个 'none' 值,表示该资源完全被禁止,或者指定一个或多个源表达式,表示该类资源的合法源。见 Fetch 指令语法

后备值

有些 Fetch 指令是作为其他具体指令的后备值。这意味着如果没有指定具体的指令,就对该资源类型使用后备值提供的策略。

  • default-src 是其他所有 Fetch 指令的后备值。
  • script-srcscript-src-attrscript-src-elem 的后备值。
  • style-srcstyle-src-attrstyle-src-elem 的后备值。
  • child-srcframe-srcworker-src 的后备值。

例如:

  • 如果没有提供 img-src,但包含了 default-src,那么 default-src 定义的策略将应用于图像。
  • 如果没有提供 script-src-elem,但包含了 script-src,那么 script-src 定义的策略将应用于 <script> 元素。
  • 如果 script-src-elemscript-src 都没有提供,但包含了 default-src,那么 default-src 定义的策略将应用于 <script> 元素。

文档指令

文档指令管理适用策略的文档或 worker 环境的属性。

base-uri

限制在 DOM 中 <base> 元素可以使用的 URL。

sandbox

类似 <iframe> sandbox 属性,为请求的资源启用沙盒。

导航指令

导航指令管理用户可以导航或者提交表单的位置。

form-action

限制可用作给定上下文表单提交目标的 URL。

frame-ancestors

指定可能嵌入页面的有效父项 <frame><iframe><object><embed>

报告指令

报告指令控制 CSP 违规报告的目标 URL。作用于 Content-Security-PolicyContent-Security-Policy-Report-Only

report-to

提供代表一个或多个报告端点的 token,用于发送 CSP 违规信息。 token 代表的断点通过其他 HTTP 标头提供,比如 Reporting-EndpointsReport-To 已弃用

警告: 此指令意图替换 report-uri;在支持 report-to 的浏览器,report-uri 会被忽略。 但是,在 report-to 被广泛支持前,你应该两者均指定(其中 endpoint_name 是单独提供的端点的名字):

http
Content-Security-Policy: ; report-uri https://endpoint.example.com; report-to endpoint_name

其他指令

require-trusted-types-for 实验性

在 DOM XSS 注入落点强制执行 Trusted Type

trusted-types 实验性

用于指定 Trusted Type 策略的允许值。Trusted Type 允许程序禁用 DOM XSS 注入落点,只接受不可欺骗的、固定的值,以代替字符串。

upgrade-insecure-requests

让浏览器把一个网站所有的不安全 URL(通过 HTTP 访问)当做已经被安全的 URL 链接(通过 HTTPS 访问)替代。这个指令是为了那些有大量不安全的遗留 URL 需要被重写时候准备的。

弃用指令

block-all-mixed-content 已弃用

当页面使用 HTTPS 时,阻止使用 HTTP 的资源加载。

report-uri 已弃用

给浏览器提供发送 CSP 违规报告的 URL。已经被 report-to 指令取代。

Fetch 指令语法

所有的 Fetch 指令可以指定为以下形式之一:

  • 单独 'none' 值,表示应完全阻止加载特定资源类型。
  • 一个或多个源表达式值,表示该资源类型的合法来源。

每个来源表达式可以采用以下列出的形式之一。需要注意的是,并非所有形式都适用于所有 Fetch 指令:请参阅每个 Fetch 指令的文档,了解适用的形式。

<host-source><scheme-source> 格式必须不加引号,而其他所有格式必须用单引号括起来。

'nonce-<nonce_value>'

该值由字符串 nonce- 和一个 Base64 编码的字符串组成。此字符串是服务器为每个 HTTP 响应生成的随机值。例如:

'nonce-416d1177-4d12-4e3b-b7c9-f6c409789fb8'

然后,服务器可以将相同的值作为任何 <script><style> 资源的 nonce 属性的值,这些资源是希望从文档加载的。

浏览器将 CSP 指令中的值与元素属性中的值进行比较,仅当两者匹配时才加载资源。

如果指令中同时包含 nonce 和 unsafe-inline,浏览器会忽略 unsafe-inline

有关更多用法信息,请参阅 CSP 指南中的 Nonce

备注: Nonce 来源表达式仅适用于 <script><style> 元素。

'<hash_algorithm>-<hash_value>'

该值由标识哈希算法的字符串、-和一个表示哈希值的 base64 编码字符串组成。

  • 哈希算法标识符必须是 sha256sha384sha512 之一。
  • 哈希值是使用以下哈希函数之一计算的 <script><style> 资源的哈希值的 base64 编码:SHA-256、SHA-384 或 SHA-512。

例如:

http
'sha256-cd9827ad...'

当浏览器接收文档时,它会对所有 <script><style> 元素的内容进行哈希计算,将结果与 CSP 指令中的任何哈希值进行比较,仅在匹配时加载资源。

如果元素加载外部资源(例如,通过 src 属性),则元素还必须设置 integrity 属性。

如果指令中同时包含哈希和 unsafe-inline,浏览器会忽略 unsafe-inline

有关更多用法信息,请参阅 CSP 指南中的哈希值

备注: 哈希来源表达式仅适用于 <script><style> 元素。

<host-source>

主机URL 或 IP 地址,是资源的有效来源。

协议、端口号和路径是可选的。

如果省略协议,则使用文档源的协议。

匹配协议时允许安全升级。例如:

  • 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,则 CSP 'self' 也允许来自 https://example.com 的资源。
  • 如果文档来自 ws://example.org,则 CSP 'self' 也允许来自 wss://example.org 的资源。

'unsafe-eval'

默认情况下,如果 CSP 包含 default-srcscript-src 指令,则禁止使用动态计算其参数为 JavaScript 的 JavaScript 函数。这包括 eval()setTimeout()code 参数,或 Function() 构造函数。

unsafe-eval 关键字可用于撤销此保护,允许动态计算字符串为 JavaScript。

警告: 开发人员应避免使用'unsafe-eval',因为它破坏了 CSP 的大部分保护目的。

有关更多用法信息,请参阅 CSP 指南中的 eval() 和类似的 API

'wasm-unsafe-eval'

默认情况下,如果 CSP 包含 default-srcscript-src 指令,则页面不允许使用诸如 WebAssembly.compileStreaming() 之类的函数编译 WebAssembly。

wasm-unsafe-eval 关键字可用于撤销此保护。这是比 'unsafe-eval' 更安全的替代方案,因为它不会启用 JavaScript 的一般计算。

'unsafe-inline'

默认情况下,如果 CSP 包含 default-srcscript-src 指令,则禁止执行内联 JavaScript。这包括:

  • 内联 <script> 标签
  • 内联事件处理器属性
  • javascript: URL

类似地,如果 CSP 包含 default-srcstyle-src 指令,则内联 CSS 也不会被加载,包括:

  • 内联 <style> 标签
  • style 属性。

unsafe-inline 关键字可用于撤销此保护,允许加载所有这些形式的资源。

警告: 开发人员应避免使用 'unsafe-inline',因为它破坏了 CSP 的大部分保护目的。

有关更多用法信息,请参阅 CSP 指南中的内联 JavaScript

'unsafe-hashes'

默认情况下,如果 CSP 包含 default-srcscript-src 指令,则内联事件处理程序属性(如 onclick)和内联 style 属性不允许执行。

'unsafe-hashes' 表达式允许浏览器对内联事件处理程序和 style 属性使用哈希表达式。例如,一个 CSP 指令可能包含以下内容:

http
script-src 'unsafe-hashes' 'sha256-cd9827ad...'

如果哈希值与内联事件处理程序属性值或 style 属性值的哈希值匹配,则允许代码执行。

警告: 'unsafe-hashes' 值是不安全的。

特别是,攻击者可以将内联事件处理程序属性的内容注入到内联 <script> 元素中,以此实现攻击。例如,假设内联事件处理程序是:

html
<button onclick="transferAllMyMoney()">转账所有资金</button>

如果攻击者能够注入一个包含此代码的内联 <script> 元素,CSP 会允许它自动执行。

即使这样,'unsafe-hashes''unsafe-inline' 要安全得多。

'inline-speculation-rules'

默认情况下,如果 CSP 包含 default-srcscript-src 指令,则不允许执行内联 JavaScript。'inline-speculation-rules' 允许浏览器加载 type 属性为 speculationrules 的内联 <script> 元素。

有关更多信息,请参阅推测规则 API

'strict-dynamic'

'strict-dynamic' 关键字使得通过 noncehash 信任的脚本扩展到此脚本动态加载的脚本,例如通过使用 Document.createElement() 创建新的 <script> 标签,然后通过 Node.appendChild() 将其插入文档中。

如果此关键字出现在指令中,则以下来源表达式值都将被忽略:

有关更多用法信息,请参阅 CSP 指南中的 strict-dynamic 关键字

'report-sample'

如果此表达式包含在控制脚本或样式的指令中,并且该指令导致浏览器阻止任何内联脚本、内联样式或事件处理程序属性的执行,则浏览器生成的违规报告将包含一个 sample 属性,其中包含被阻止资源的前 40 个字符。

Worker 中的 CSP

Worker 一般来说被创建他的文档(或者父级 Worker)的 CSP 管理。如果要为 Worker 指定 CSP,可以为 Worker 脚本的请求设置 CSP 响应标头 Content-Security-Policy

例外的情况是,如果 Worker 脚本的来源是一个全局唯一 ID(比如,它的 URL 是一个结构化的数据或者 blob)。在这种情况下,这个 Worker 会继承它所属的文档或者创建它的 Worker 的 CSP。

多重内容安全策略

CSP 允许在一个资源中指定多个策略,包括通过 Content-Security-Policy 标头,以及 Content-Security-Policy-Report-Only 标头,和 <meta> 元素。

你可以像以下实例一样多次调用 Content-Security-Policy 标头。特别注意这里的 connect-src 指令。尽管第二个策略允许连接,第一个策略仍然包括了 connect-src 'none'。添加了附加的策略后,只会让资源保护的能力更强,也就是说不会允许任何连接,等同于最严格的策略 connect-src 'none' 强制执行。

http
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-inlineunsafe-eval,内联代码被禁用。

http
Content-Security-Policy: default-src https:

同样的限制可以通过 HTML <meta> 元素施加。

html
<meta http-equiv="Content-Security-Policy" content="default-src https:" />

允许内联代码和 HTTPS 资源,但禁用插件

此策略可用于已存在的网站中有过多内联代码的情况,旨在确保资源仅通过 HTTPS 加载,并禁用插件:

http
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'

测试时报告但不施加限制

此示例设置了与前一个例子相同的限制,但使用了 Content-Security-Policy-Report-Only 标头和 report-to 指令。这种方法在测试期间使用,用于报告违规行为但不阻止代码执行。

报告端点(URL)使用 Reporting-Endpoints HTTP 响应标头定义。

http
Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"

然后在 CSP 中使用 report-to 指令选择特定的端点作为报告目标。

http
Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-url/; report-to csp-endpoint

请注意,report-uri 已弃用 指令在上面的示例中也被指定,因为 report-to 在浏览器中的支持尚未广泛。

更多示例请参阅内容安全策略(CSP)实现

规范

Specification
Content Security Policy Level 3
# csp-header

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobile
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Content-Security-Policy
base-uri
block-all-mixed-content
Deprecated
child-src
connect-src
default-src
fenced-frame-src
Experimental
font-src
form-action
Redirects are blocked after a form submission
Non-standard
frame-ancestors
frame-src
img-src
manifest-src
media-src
<meta> element support
object-src
prefetch-src
DeprecatedNon-standard
report-sample source value
report-to
report-uri
Deprecated
require-trusted-types-for
Experimental
sandbox
script-src
External scripts with hash
inline-speculation-rules source expression
Experimental
Source expression allowing WebAssembly execution
script-src-attr
script-src-elem
strict-dynamic source value
style-src
style-src-attr
style-src-elem
trusted-types
Experimental
unsafe-hashes source value
upgrade-insecure-requests
worker-src
Worker support

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
Partial support
Partial support
No support
No support
Experimental. Expect behavior to change in the future.
Non-standard. Check cross-browser support before using.
Deprecated. Not for use in new websites.
See implementation notes.
User must explicitly enable this feature.
Uses a non-standard name.
Has more compatibility info.

参见