内容安全策略 (CSP) 标头

Baseline 广泛可用 *

此功能已相当成熟,可在多种设备和浏览器版本上运行。自 ⁨2016 年 8 月⁩ 起,所有浏览器均已提供此功能。

* 此特性的某些部分可能存在不同级别的支持。

HTTP Content-Security-Policy 响应标头允许网站管理员控制用户代理被允许为给定页面加载的资源。除少数例外,策略主要涉及指定服务器来源和脚本端点。这有助于防范跨站点脚本攻击。

有关 CSP 如何传递到浏览器、其外观以及用例和部署策略的详细信息,请参阅内容安全策略 (CSP) 指南。

头类型 响应头
禁止请求头

语法

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

其中 <policy-directive> 由以下内容组成:<directive> <value>,无内部标点符号。

指令

Fetch 指令

Fetch 指令控制可以从哪些位置加载特定资源类型。

child-src

定义使用 <frame><iframe> 等元素加载的Web Worker 和嵌套浏览上下文的有效源。

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

指定样式表 <style> 元素和带有 rel="stylesheet"<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> 元素。

文档指令

文档指令控制应用策略的文档或 工作器环境的属性。

base-uri

限制可用于文档 <base> 元素的 URL。

sandbox

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

导航指令控制用户可以导航或提交表单的位置,例如。

form-action

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

frame-ancestors

指定可以使用 <frame><iframe><object><embed> 嵌入页面的有效父级。

报告指令

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

report-to

向浏览器提供一个令牌,用于识别向其发送 CSP 违规信息的报告端点或端点组。令牌所代表的端点通过其他 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 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 值可以使用 Base64URL 安全 Base64 中的任何字符。

此字符串是服务器为每个 HTTP 响应生成的随机值。例如:

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

然后,服务器可以将相同的值作为任何打算从文档加载的 <script><style> 资源的 nonce 属性的值包含在内。

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

如果指令包含 nonce 和 unsafe-inline,则浏览器将忽略 unsafe-inline

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

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

'<hash_algorithm>-<hash_value>'

此值由一个标识哈希算法的字符串,后跟 -,再后跟一个哈希值组成。哈希值可以使用 Base64URL 安全 Base64 中的任何字符。

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

例如

'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 提供的,则 'self' 的 CSP 也将允许来自 https://example.com 的资源。
  • 如果文档是从 ws://example.org 提供的,则 'self' 的 CSP 也将允许来自 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()">Transfer all my money</button>

如果攻击者可以注入包含此代码的内联 <script> 元素,则 CSP 将自动允许其执行。

但是,'unsafe-hashes''unsafe-inline' 安全得多。

'inline-speculation-rules'

默认情况下,如果 CSP 包含 default-srcscript-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'

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) 实现

规范

规范
内容安全策略级别 3
# csp-header

浏览器兼容性

另见