内容安全策略CSP是安全性的附加层,有助于检测和缓解某些类型的攻击,包括跨站点脚本(Cross Site Scripting (XSS) Software Attack | OWASP Foundation)和数据注入攻击。这些攻击可用于从数据盗窃,站点损坏到恶意软件分发的所有方面。
CSP被设计为完全向后兼容(除CSP版本2,其中有在向后兼容性一些明确提到的不一致性)。
不支持它的浏览器仍然可以与实现它的服务器一起使用,反之亦然。
不支持CSP的浏览器只是忽略它,照常运行,默认为Web内容的标准同源策略。
如果站点不提供CSP标头,则浏览器同样会使用标准同源策略。
启用CSP需要配置Web服务器以返回Content-Security-PolicyHTTP标头。
或者<meta>元素可用于配置策略,例如:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
威胁缓解跨站点脚本
CSP的主要目标是减轻XSS攻击。
XSS攻击利用浏览器对服务器接收的内容的信任机制。
恶意脚本由受害人的浏览器执行,因为浏览器信任内容的来源。
与CSP兼容的浏览器将仅执行从那些允许列出的域接收的源文件中加载的脚本,而忽略所有其他脚本(包括内联脚本和事件处理HTML属性)。
如果不想让脚本执行的站点可以选择全局禁止脚本执行。
缓解数据包嗅探攻击
除了限制可以加载内容的域之外,服务器还可以指定允许使用哪些协议。
服务器可以指定必须使用HTTPS加载所有内容。
完整的数据传输安全策略不仅包括强制HTTPS进行数据传输,包括使用secure属性标记所有cookie并提供从HTTP页面到其HTTPS副本的自动重定向。
站点还可以使用Strict-Transport-SecurityHTTP标头来确保浏览器仅通过加密通道连接到它们。
使用CSP
配置内容安全策略涉及将Content-Security-PolicyHTTP标头添加到网页,并为其提供值以控制允许用户代理为该页面加载哪些资源。
例如,上传和显示图像的页面可以允许任何位置的图像,但是将表单操作限制为特定的端点。
正确设计的内容安全策略有助于保护页面免受跨站点脚本攻击。
本文介绍了如何正确构造此类标头,并提供了示例。
您可以使用Content-Security-PolicyHTTP标头指定策略,如下所示:
<span style="color:#333333">Content-Security-Policy: <em>policy</em></span>
该策略是一个字符串,其中包含描述的内容安全策略的策略指令。
撰写政策
使用一系列策略指令来描述策略,每个策略指令都描述特定资源类型或策略区域的策略。
策略应包含一个default-src策略指令,当其他资源类型没有自己的策略时,该指令将作为备用资源(default-src指令说明)。
策略需要包含default-src
或script-src
指令,以防止运行内联脚本以及阻止使用eval()
。
策略需要包含default-src
或style-src指令,以限制从<script>元素或元素中应用内联样式。
style
属性。有针对各种项目类型的特定指令,因此每种类型都可以有自己的策略,包括字体,框架,图像,音频和视频媒体,脚本和工作程序。
示例:常见用例
本节提供了一些常见安全策略方案的示例。
所有内容都来自网站本身的来源(不包括子域)。
<span style="color:#333333">Content-Security-Policy: default-src 'self'</span>
允许来自受信任域及其所有子域的内容(不必与设置CSP的域相同)。
<span style="color:#333333">Content-Security-Policy: default-src 'self' *.trusted.com</span>
例子3
允许Web应用程序的用户在其自己的内容中包括来自任何来源的图像,
但将音频或视频媒体限制为受信任的提供程序,并且将所有脚本限制为承载托管代码的特定服务器。
<span style="color:#333333">Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com</span>
此处,默认情况下,仅允许从文档的原始内容开始,但以下情况除外:
- 图片可以从任何位置加载(请注意,“ *”通配符)。
- 仅允许来自media1.com和media2.com的媒体(不允许来自这些站点的子域)。
- 可执行脚本只允许来自userscripts.example.com。
例子4
在线银行网站的网站管理员希望确保使用TLS加载其所有内容,以防止攻击者窃听请求。
<span style="color:#333333">Content-Security-Policy: default-src https://onlinebanking.jumbobank.com</span>
该服务器仅允许访问通过单一来源onlinebanking.jumbobank.com通过HTTPS专门加载的文档。
例子5
网站站点的网站管理员希望允许电子邮件中的HTML以及从任何地方加载的图像,但不允许JavaScript或其他潜在危险的内容。
<span style="color:#333333">Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *</span>
此示例未指定script-src,对于示例CSP,该站点使用default-src伪指令指定的设置,这意味着只能从原始服务器加载脚本。
测试policy
为了简化部署,可以以仅报告模式部署CSP。该策略未强制执行,但是任何违规都会报告给提供的URI。
此外,仅报告头可用于测试策略的将来修订版本,而无需实际部署它。
可以使用Content-Security-Policy-Report-OnlyHTTP标头指定策略,如下所示:
<span style="color:#333333">Content-Security-Policy-Report-Only: <em>policy</em> </span>
如果一个Content-Security-Policy-Report-Only标头和一个Content-Security-Policy标头都出现在同一响应中,则将遵循这两个策略。
Content-Security-Policy
标头中指定的策略在Content-Security-Policy-Report-Only
生成报告时强制执行,但不强制执行。
启用report
默认情况下,不发送违规报告。要启用违规报告,您需要指定report-uri(另一篇)
策略指令,并至少提供一个将报告发送到的URI:
<span style="color:#333333">Content-Security-Policy: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi</span>
然后,您需要设置服务器以接收报告。它可以按照您认为合适的任何方式存储或处理它们。
违规report语法
报告JSON对象包含以下数据:
blocked-uri
内容安全策略阻止加载的资源的URI。如果被阻止的URI与的来源不同document-uri
,则被阻止的URI将被截断以仅包含方案,主机和端口。
disposition
任一"enforce"
或"report"
取决于是否Content-Security-Policy-Report-Only报头或Content-Security-Policy
报头被使用。
document-uri
发生违规的文档的URI。
effective-directive
其执行导致违规的指令。
original-policy
Content-Security-Policy
HTTP标头指定的原始策略。
referrer
发生违规的文档的引荐来源。
script-sample
内联脚本,事件处理程序或样式中引起冲突的前40个字符。
status-code
实例化全局对象的资源的HTTP状态代码。
violated-directive
违反的策略部分的名称。
违规report
位于的页面http://example.com/signup.html,
使用以下策略,除了中的样式表之外,不允许使用其他任何内容cdn.example.com
。
<span style="color:#333333">Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports</span>
HTML signup.html
如下所示:
<span style="color:#333333"><code class="language-html"><span style="color:#708090"><!DOCTYPE html></span>
<span style="color:#990055"><span style="color:#990055"><span style="color:#999999"><</span>html</span><span style="color:#999999">></span></span><span style="color:#990055"><span style="color:#990055"><span style="color:#999999"><</span>head</span><span style="color:#999999">></span></span><span style="color:#990055"><span style="color:#990055"><span style="color:#999999"><</span>title</span><span style="color:#999999">></span></span>Sign Up<span style="color:#990055"><span style="color:#990055"><span style="color:#999999"></</span>title</span><span style="color:#999999">></span></span><span style="color:#990055"><span style="color:#990055"><span style="color:#999999"><</span>link</span> <span style="color:#669900">rel</span><span style="color:#0077aa"><span style="color:#999999">=</span><span style="color:#999999">"</span>stylesheet<span style="color:#999999">"</span></span> <span style="color:#669900">href</span><span style="color:#0077aa"><span style="color:#999999">=</span><span style="color:#999999">"</span>css/style.css<span style="color:#999999">"</span></span><span style="color:#999999">></span></span><span style="color:#990055"><span style="color:#990055"><span style="color:#999999"></</span>head</span><span style="color:#999999">></span></span><span style="color:#990055"><span style="color:#990055"><span style="color:#999999"><</span>body</span><span style="color:#999999">></span></span>... Content ...<span style="color:#990055"><span style="color:#990055"><span style="color:#999999"></</span>body</span><span style="color:#999999">></span></span>
<span style="color:#990055"><span style="color:#990055"><span style="color:#999999"></</span>html</span><span style="color:#999999">></span></span></code></span>
样式表仅允许从加载cdn.example.com
,而网站尝试从其自身的原点(http://example.com
)加载样式表。
能够执行CSP的浏览器将在http://example.com/_/csp-reports
访问文档时将以下违规报告作为POST请求发送给:
<span style="color:#333333"><code class="language-html">{"csp-report": {"document-uri": "http://example.com/signup.html","referrer": "","blocked-uri": "http://example.com/css/style.css","violated-directive": "style-src cdn.example.com","original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports"}
}</code></span>
该报告在中包含违规资源的完整路径blocked-uri
。
这并非总是如此。例如,如果signup.html
尝试从中加载CSS http://anothercdn.example.com/stylesheet.css
,则浏览器将不包括完整路径,而仅包括源(http://anothercdn.example.com
)。
CSP规范对这种奇怪的行为进行了解释(Content Security Policy Level 3)。
这样做是为了防止泄漏有关跨域资源的敏感信息。
浏览器兼容性
GitHub - mdn/browser-compat-data: This repository contains compatibility data for Web technologies as displayed on MDN