内容安全策略
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-src
img-src
-
指定图像和网站图标的有效来源。
manifest-src
-
指定应用程序清单文件的有效来源。
media-src
object-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-elem
style-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 表仅在浏览器中加载