什么是内容安全策略?
Content-Security-Policy是现代浏览器用来增强文档(或网页)安全性的 HTTP 响应标头的名称。Content-Security-Policy 标头允许您限制可以加载哪些资源(例如 JavaScript、CSS、图像等)以及可以从哪些 URL 加载这些资源。
虽然它主要用作 HTTP 响应标头,但您也可以通过
元标记
应用它。
术语“内容安全策略”通常缩写为CSP。
CSP 最初旨在减少跨站点脚本 (XSS) 攻击的攻击面,后来版本的规范还可以防御其他形式的攻击,例如点击劫持 (Click Jacking)。
CSP 指令参考
标Content-Security-Policy
头值由一个或多个指令(定义如下)组成,多个指令用分号分隔;
本文档基于内容安全策略级别 2 W3C 建议
和 CSP 级别 3 W3C 工作草案提供
default-src
该default-src
指令定义了获取 JavaScript、图像、CSS、字体、AJAX 请求、框架、HTML5 媒体等资源的默认策略。并非所有指令都会回退到default-src
。请参阅源列表参考
以了解可能的值。
示例 DEFAULT-SRC 策略
default-src 'self' cdn.example.com;
CSP 1 级 25+ 23+ 7+ 12+
script-src
定义有效的 JavaScript 源。
示例 SCRIPT-SRC 策略
script-src 'self' js.example.com;
CSP 1 级 25+ 23+ 7+ 12+
style-src
定义样式表或 CSS 的有效来源。
示例 STYLE-SRC 策略
style-src 'self' css.example.com;
CSP 1 级 25+ 23+ 7+ 12+
img-src
定义有效的图像来源。
示例 IMG-SRC 政策
img-src 'self' img.example.com;
CSP 1 级 25+ 23+ 7+ 12+
connect-src
适用于XMLHttpRequest
(AJAX)、、WebSocket
或fetch()
。如果不允许,浏览器将模拟<a ping>
HTTP状态代码。EventSource``400
示例 CONNECT-SRC 策略
connect-src 'self';
CSP 1 级 25+ 23+ 7+ 12+
font-src
定义字体资源的有效来源(通过 加载@font-face
)。
示例 FONT-SRC 策略
font-src font.example.com;
CSP 1 级 25+ 23+ 7+ 12+
object-src
定义有效的插件源,例如<object>
或。<embed>``<applet>
示例 OBJECT-SRC 策略
object-src 'self';
CSP 1 级 25+ 23+ 7+ 12+
media-src
定义有效的音频和视频源,例如 HTML5元素<audio>
。<video>
示例 MEDIA-SRC 策略
media-src media.example.com;
CSP 1 级 25+ 23+ 7+ 12+
frame-src
定义加载框架的有效来源。在 CSP 级别 2 中,该指令frame-src
已被弃用child-src
。在 CSP 级别 3 中,该指令已取消 弃用,如果不存在,frame-src
将继续遵循该指令。child-src
示例 FRAME-SRC 策略
frame-src 'self';
CSP 1 级
sandbox
为与属性类似的请求资源启用沙盒iframe
sandbox
。沙盒应用同源策略,阻止弹出窗口、插件和脚本执行。您可以将沙盒值保留为空以保留所有限制,或添加标志:allow-forms
allow-same-origin
allow-scripts
allow-popups
、、、、、、和allow-modals``allow-orientation-lock``allow-pointer-lock``allow-presentation``allow-popups-to-escape-sandbox``allow-top-navigation
沙箱策略示例
sandbox allow-forms allow-scripts;
CSP 1 级 25+ 50+ 7+ 12+
report-uri
指示浏览器将策略失败报告发布到此 URI。您还可以将Content-Security-Policy-Report-Only
其用作 HTTP 标头名称,以指示浏览器仅发送报告(不阻止任何内容)。此指令在 CSP 级别 3 中已弃用,取而代之的是该report-to
指令。
示例 REPORT-URI
report-uri /some-report-uri;
CSP 1 级 25+ 23+ 7+ 12+
child-src
定义使用以下元素加载的 Web 工作者和嵌套浏览上下文的有效来源
CHILD-SRC 策略示例
child-src 'self'
CSP 2 级 40+ 45 岁以上 15+
form-action
定义可用作 HTML<form>
操作的有效源。
表单操作策略示例
form-action 'self';
CSP 2 级 40+ 36+ 15+
frame-ancestors
定义使用 嵌入资源的有效来源<frame>
<iframe>
<object>
<embed>
<applet>
。将此指令设置为'none'
大致相当于X-Frame-Options: DENY
示例 FRAME-ANCESTORS 策略
frame-ancestors 'none';
CSP 2 级 39+ 33+ 15+
plugin-types
<object>
为通过和调用的插件定义有效的 MIME 类型 <embed>
。要加载 ,<applet>
您必须指定application/x-java-applet
。
插件类型策略示例
plugin-types application/pdf;
CSP 2 级 40+ 15+
base-uri
定义一组允许的 URL,可以在src
HTMLbase
标签的属性中使用。
示例 BASE-URI 策略
base-uri 'self';
CSP 2 级 40+ 15+
report-to
定义由 HTTP 响应标头定义的报告组Report-To
名称。有关详细信息,请参阅报告 API
。
报告指令示例
report-to groupName;
CSP 3 级 70+
worker-src
限制可以作为 Worker、SharedWorker 或 ServiceWorker 加载的 URL。
示例 WORKER-SRC 策略
worker-src 'none';
CSP 3 级 59+ 58 岁以上
manifest-src
限制应用程序清单可以加载的 URL。
示例 MANIFEST-SRC 策略
manifest-src 'none';
CSP 3 级 是的 40+
prefetch-src
定义请求预取和预渲染的有效源,例如通过link
带有rel="prefetch"
或 的标签rel="prerender"
:
示例 PREFETCH-SRC 策略
prefetch-src 'none'
CSP 3 级
navigate-to
限制文档可以通过任何方式导航到的 URL。例如,当单击链接、提交表单或window.location
调用时。如果form-action
存在,则表单提交将忽略此指令。已从 CSP 3 规范中删除。
示例导航至策略
navigate-to example.com
CSP 3 级
upgrade-insecure-requests
自动将链接、图像、javascript、css 等的 URL 从 http 转换为 https。
示例 UPGRADE-INSECURE-REQUESTS 策略
upgrade-insecure-requests
43+ 42+ 10.1+ 17+ 从技术上来说,不属于 CSP 规范的一部分。
block-all-mixed-content
阻止对不安全的 http URL 的请求。
示例 BLOCK-ALL-MIXED-CONTENT 策略
block-all-mixed-content
从技术上来说,它不属于 CSP 规范的一部分,将来可能会被删除。
源列表参考
所有以 结尾的指令都-src
支持类似的值,称为源列表。多个源列表值可以用空格分隔,但'none'
其中一个值应是唯一的。
源值 | 例子 | 描述 |
---|---|---|
* |
img-src * |
通配符,允许除数据:blob:文件系统:方案之外的任何 URL。 |
'none' |
object-src 'none' |
防止从任何来源加载资源。 |
'self' |
script-src 'self' |
允许从同一来源(相同方案、主机和端口)加载资源。 |
data: |
img-src 'self' data: |
允许通过数据方案加载资源(例如 Base64 编码的图像)。 |
*domain.example.com* |
img-src domain.example.com |
允许从指定域名加载资源。 |
**.example.com* |
img-src *.example.com |
允许从 下的任何子域加载资源*example.com* 。 |
*https://cdn.com* |
img-src https://cdn.com |
仅允许通过与给定域匹配的 HTTPS 加载资源。 |
https: |
img-src https: |
仅允许在任何域上通过 HTTPS 加载资源。 |
'unsafe-inline' |
script-src 'unsafe-inline' |
允许使用内联源元素,如 style 属性、onclick 或脚本标记体(取决于其所应用的源的上下文)和javascript: URI |
'unsafe-eval' |
script-src 'unsafe-eval' |
允许不安全的动态代码评估,例如 JavaScripteval()
|
'sha256-' |
script-src 'sha256-xyz...' |
如果内联脚本或 CSS 的哈希值与标头中指定的哈希值匹配,则允许执行该脚本或 CSS。目前支持 SHA256、SHA384 或 SHA512。CSP 级别 2 |
'nonce-' |
script-src 'nonce-rAnd0m' |
如果脚本(例如<script nonce="rAnd0m"> :)标签包含与 CSP 标头中指定的 nonce 匹配的 nonce 属性,则允许执行内联脚本或 CSS。nonce 应为安全随机字符串,且不得重复使用。CSP级别 2 |
'strict-dynamic' |
script-src 'strict-dynamic' |
允许允许的脚本通过非“解析器插入”脚本元素加载其他脚本(例如document.createElement('script'); 允许)。CSP 级别 3 |
'unsafe-hashes' |
script-src 'unsafe-hashes' 'sha256-abc...' |
允许您在事件处理程序中启用脚本(例如onclick )。不适用于javascript: 或内联<script> CSP 级别 3 |
内容安全策略示例
以下是内容安全策略的几个常见场景:
允许所有内容,但仅限来自同一来源
默认源‘self’;
仅允许来自同一来源的脚本
脚本src‘self’;
允许 Google Analytics、Google AJAX CDN 和同源
脚本src‘self’www.google-analytics.com ajax.googleapis.com;
入门政策
此策略允许来自同一来源的图像、脚本、AJAX、表单操作和 CSS,并且不允许加载任何其他资源(例如对象、框架、媒体等)。对于许多网站来说,这是一个很好的起点。
默认 src 'none';脚本 src 'self';连接 src 'self';img src 'self';样式 src 'self';base-uri 'self';表单操作 'self'
内容安全策略错误消息
在 Chrome 中,当发生内容安全策略脚本违规时,您会在Chrome 开发者工具中收到类似这样的消息:
拒绝加载脚本‘ script-uri ’,因为它违反了以下内容安全策略指令:“你的 CSP 指令”。
在 Firefox 中,您可能会在Web 开发人员工具中看到如下消息:
内容安全策略:报告专用 CSP 策略出现违规(“尝试执行内联脚本已被阻止”)。允许此行为,并发送 CSP 报告。
除了控制台消息外,securitypolicyviolation
窗口上还会触发事件。
服务器端配置
任何服务器端编程环境都应允许您发回自定义 HTTP 响应标头。您也可以使用 Web 服务器发回标头。
Apache 内容安全策略标头
将以下内容添加到您的或文件httpd.conf
中:VirtualHost``.htaccess
标头设置 Content-Security-Policy “default-src‘self’;”
Nginx 内容安全策略标头
在您的server {}
块中添加:
add_header Content-Security-Policy "default-src‘self’;";
您还可以将其附加always
到末尾,以确保 nginx 无论响应代码如何都会发送标头。
IIS 内容安全策略标头
您可以使用 IIS 管理器中的 HTTP 响应标头 GUI 或将以下内容添加到您的 web.config:
<系统.web服务器>
<http协议>
<自定义标题>
<add name="Content-Security-Policy" value="default-src'self';" />
</customHeaders>
</http协议>
</system.web服务器>
网友评论