内容安全策略
HTTP 的 Content-Security-Policy 响应头允许网站管理员控制用户代理可以为给定页面加载的资源。除了一些例外,策略主要涉及指定服务器来源和脚本端点。这有助于防御跨站点脚本攻击 (跨站点脚本).
有关更多信息,请参阅有关 内容安全策略 (CSP) 的介绍性文章。
语法
Content-Security-Policy: <policy-directive>; <policy-directive>
其中 <policy-directive> 由:<directive> <value> 组成,没有内部标点符号。
指令
获取指令
获取指令 控制可以从哪些位置加载某些资源类型。
child-src-
定义了使用元素(如
<frame>和<iframe>)加载的 Web 工作线程 和嵌套浏览上下文的有效来源。警告:如果您想规范嵌套浏览上下文和工作线程,请勿使用
child-src,而应分别使用frame-src和worker-src指令。 connect-src-
限制可以使用脚本接口加载的 URL。
default-src-
用作其他 获取指令 的后备。
fenced-frame-src实验性功能-
指定加载到
<fencedframe>元素中的嵌套浏览上下文的有效来源。 font-src-
指定使用
@font-face加载字体的有效来源。 frame-srcimg-src-
指定图像和网站图标的有效来源。
manifest-src-
指定应用程序清单文件的有效来源。
media-srcobject-src-
指定
<object>和<embed>元素的有效来源。注意:受
object-src控制的元素或许是巧合地被认为是传统 HTML 元素,并且没有收到新的标准化功能(例如,<iframe>的安全属性sandbox或allow)。因此,建议限制此获取指令(例如,如果可能,显式设置object-src 'none')。 prefetch-src已弃用 非标准-
指定要预取或预渲染的有效来源。
script-src-
指定 JavaScript 和 WebAssembly 资源的有效来源。
script-src-elem-
指定 JavaScript
<script>元素的有效来源。 script-src-attr-
指定 JavaScript 内联事件处理程序的有效来源。
style-src-
指定样式表的有效来源。
style-src-elemstyle-src-attr-
指定应用于各个 DOM 元素的内联样式的有效来源。
worker-src-
指定
Worker、SharedWorker或ServiceWorker脚本的有效来源。
文档指令
导航指令
导航指令控制用户可以导航到的位置或提交表单的位置,例如。
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)视为已替换为安全 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'-
允许使用动态代码评估,例如
eval、setTimeout()和window.execScript非标准 . 'unsafe-hashes'-
允许启用特定的内联事件处理程序。
'wasm-unsafe-eval'-
允许加载和执行 WebAssembly 模块,而无需通过
'unsafe-eval'允许不安全的 JavaScript 执行。单引号是必需的。
主机值
- Host
- 仅允许加载来自特定主机的资源,具有可选的方案、端口和路径。例如,
example.com、*.example.com、https://*.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.js和https://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' 将被强制执行。
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 指令。这种方法在测试期间用于报告违规,但不阻止代码执行。
使用 Reporting-Endpoints HTTP 响应标头定义要将报告发送到的端点(URL)。
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 |
浏览器兼容性
BCD 表仅在浏览器中加载