内容安全策略

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

有关更多信息,请参阅有关 内容安全策略 (CSP) 的介绍性文章。

头类型 响应头
禁止的头名称

语法

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

其中 <policy-directive> 由:<directive> <value> 组成,没有内部标点符号。

指令

获取指令

获取指令 控制可以从哪些位置加载某些资源类型。

child-src

定义了使用元素(如 <frame><iframe>)加载的 Web 工作线程 和嵌套浏览上下文的有效来源。

警告:如果您想规范嵌套浏览上下文和工作线程,请勿使用 child-src,而应分别使用 frame-srcworker-src 指令。

connect-src

限制可以使用脚本接口加载的 URL。

default-src

用作其他 获取指令 的后备。

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> 元素的有效来源。

注意:object-src 控制的元素或许是巧合地被认为是传统 HTML 元素,并且没有收到新的标准化功能(例如,<iframe> 的安全属性 sandboxallow)。因此,建议限制此获取指令(例如,如果可能,显式设置 object-src 'none')。

prefetch-src 已弃用 非标准

指定要预取或预渲染的有效来源。

script-src

指定 JavaScript 和 WebAssembly 资源的有效来源。

script-src-elem

指定 JavaScript <script> 元素的有效来源。

script-src-attr

指定 JavaScript 内联事件处理程序的有效来源。

style-src

指定样式表的有效来源。

style-src-elem

指定样式表 <style> 元素和 rel="stylesheet"<link> 元素的有效来源。

style-src-attr

指定应用于各个 DOM 元素的内联样式的有效来源。

worker-src

指定 WorkerSharedWorkerServiceWorker 脚本的有效来源。

文档指令

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

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)视为已替换为安全 URL(通过 HTTPS 提供的 URL)。此指令旨在用于具有大量不安全传统 URL 的网站,这些 URL 需要被重写。

已弃用指令

block-all-mixed-content 已弃用

防止在使用 HTTPS 加载页面时使用 HTTP 加载任何资产。

report-uri 已弃用

为浏览器提供一个 URL,用于发送 CSP 违规报告。这已被 report-to 指令取代。

允许的值概述如下。有关详细参考,请参见 CSP 源值 以及各个指令的文档。

关键字值

'none'

不允许加载任何资源。

'self'

仅允许来自当前来源的资源。

'strict-dynamic'

由于附带的 nonce 或哈希,页面中脚本获得的信任会扩展到它加载的脚本。

'report-sample'

要求在违规报告中包含违规代码的样本。

'inline-speculation-rules'

允许在脚本中包含 推测规则(另请参见 <script type="speculationrules">)。

不安全关键字值

'unsafe-inline'

允许使用内联资源。

'unsafe-eval'

允许使用动态代码评估,例如 evalsetTimeout()window.execScript 非标准 .

'unsafe-hashes'

允许启用特定的内联事件处理程序。

'wasm-unsafe-eval'

允许加载和执行 WebAssembly 模块,而无需通过 'unsafe-eval' 允许不安全的 JavaScript 执行。单引号是必需的。

主机值

  • Host
    • 仅允许加载来自特定主机的资源,具有可选的方案、端口和路径。例如,example.com*.example.comhttps://*.example.com:12/path/to/file.js
    • CSP 中以 / 结尾的路径部分将匹配它们是前缀的任何路径。例如,example.com/api/ 将匹配 example.com/api/users/new 之类的 URL。
    • CSP 中的其他路径部分将精确匹配;例如,example.com/file.js 将匹配 http://example.com/file.jshttps://example.com/file.js,但不匹配 https://example.com/file.js/file2.js
  • 方案
    • 仅允许加载来自特定方案的资源,应始终以 ":" 结尾。例如,https:http:data: 等。

其他值

'nonce-*'

一个加密 nonce(仅使用一次)来允许脚本。服务器必须在每次传输策略时生成唯一的 nonce 值。提供一个不可猜测的 nonce 非常重要,因为否则绕过资源策略将是微不足道的。这与 脚本标签 nonce 属性 结合使用。例如,nonce-DhcnhD3khTMePgXwdayK9BsMqXjhguVV

'sha*-*'

sha256、sha384 或 sha512。后面跟一个连字符,然后是 sha* 值。例如,sha256-jzgBGA4UWFFmpOBq0JpdsySukE1FrEN5bUpoK8Z29fY=

工作线程中的 CSP

工作线程 通常不受创建它们的文档(或父工作线程)的内容安全策略控制。要为工作线程指定内容安全策略,请为请求工作线程脚本本身的请求设置 Content-Security-Policy 响应头。

唯一的例外是,如果工作者脚本的来源是全局唯一的标识符(例如,如果其 URL 的方案是 data 或 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 指令。这种方法在测试期间用于报告违规,但不阻止代码执行。

使用 Reporting-Endpoints HTTP 响应标头定义要将报告发送到的端点(URL)。

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

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅