内容安全策略(Content Security Policy)简称CSP
是由W3C小组定义的一项规范,其主要做用是提供一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等.javascript
目前内容安全策略(Content Security Policy)的规范一共有三个版本:css
如今主要使用的是第二个版本,第三个版本目前还在草案当中html
CSP
被设计出来的目的就是为了效防范内容注入攻击,如XSS攻击等.前端
它经过让开发者对本身WEB应用声明一个外部资源加载的白名单,使得客户端在运行WEB应用时对外部资源的加载作出筛选和识别,只加载被容许的网站资源.对于不被容许的网站资源不予加载和执行.同时,还能够将WEB应用中出现的不被容许的资源连接和详情报告给咱们指定的网址.如此,大大加强了WEB应用的安全性.使得攻击者即便发现了漏洞,也无法注入脚本,除非还控制了一台列入了白名单的服务器.java
根据W3C的设计,CSP
分为两种模式:json
Content-Security-Policy
.使用这种模式,将会直接阻止非法的外部资源加载,同时也能够选择是否配置将非法资源加载的连接和行为报告给咱们指定的网址后端
Content-Security-Policy-Report-Only
使用这种模式时,客户端在遇到非法的外部资源加载时并不会阻止,而是正常加载.可是会将次加载行为和连接报告给我我指定的网址.因此使用此模式时,必需要使用report-uri
策略配置报告非法资源加载状况的网址.浏览器
以上是CSP
策略的两种模式,在实际使用中,咱们能够根据本身的状况任意选择其中一种模式.安全
CSP
的使用方式有两种:服务器
<meta>
标签,以下:<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
<!-- or -->
<meta http-equiv="content-security-policy-report-only" content="default-src 'self';">
复制代码
Content-Security-Policy
属性,如在NGINX服务器上配置以下add_header Content-Security-Policy "default-src 'self'";
# or
add_header Content-Security-Policy-Report-Only "default-src 'self'";
复制代码
经过以上两种方式的任意一种便可启用CSP
.
一个策略由一系列策略指令所组成,每一个策略指令都描述了一个针对某个特定类型资源以及生效范围的策略。你的策略应当包含一个
default-src
策略指令,在其余资源类型没有符合本身的策略时应用该策略(有关完整列表查看default-src)。一个策略能够包含default-src
或者script-src
指令来防止内联脚本运行, 并杜绝eval()
的使用。 一个策略也可包含一个default-src
或style-src
指令去限制来自一个<style>
元素或者style属性的內联样式。
示例: 常见用例,来自MDN:
Content-Security-Policy: default-src 'self'
复制代码
Content-Security-Policy: default-src 'self' *.trusted.com
复制代码
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
复制代码
在这里,各类内容默认仅容许从文档所在的源获取, 但存在以下例外:
- 图片能够从任何地方加载(注意 "*" 通配符)。
- 多媒体文件仅容许从 media1.com 和 media2.com 加载(不容许从这些站点的子域名)。
- 可运行脚本仅容许来自于 userscripts.example.com。
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
复制代码
该服务器仅容许经过HTTPS方式并仅从onlinebanking.jumbobank.com域名来访问文档。
Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
复制代码
注意这个示例并未指定script-src
。在此CSP示例中,站点经过default-src
指令的对其进行配置,这也一样意味着脚本文件仅容许从原始服务器获取
默认状况下,违规报告并不会发送。为启用发送违规报告,你须要指定report-uri
策略指令,并提供至少一个URI地址去递交报告。这个地址能够是相对于当前网站的相对地址,也能够是一个绝对地址:
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
复制代码
报告格式以下:
{
"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"
}
}
复制代码
违例报告的语法:
做为报告的JSON对象报告包含了如下数据:
document-uri
: 发生违规的文档的URI。referrer
: 违规发生处的文档引用(地址)。blocked-uri
: 被CSP阻止的资源URI。若是被阻止的URI来自不一样的源而非文档URI,那么被阻止的资源URI会被删减,仅保留协议,主机和端口号。violated-directive
: 违反的策略名称。original-policy
: 在 Content-Security-Policy HTTP 头部中指明的原始策略。
策略指令 | 策略说明 |
---|---|
default-src | 默认加载策略 |
script-src | 外部脚本 |
style-src | 样式表 |
img-src | 图像 |
media-src | 媒体文件(音频和视频) |
font-src | 字体文件 |
object-src | 插件(好比 Flash) |
child-src | 框架 |
frame-ancestors | 嵌入的外部资源(好比<iframe> 、<iframe> 、<embed> 和<applet> ) |
connect-src | HTTP 链接(经过 XHR、WebSockets、EventSource等) |
worker-src | worker脚本 |
manifest-src | manifest 文件 |
想要了解策略的所有类型能够查看这里
指令值 | 指令值说明 |
---|---|
* | 容许任何内容 |
‘none’ | 不容许任何内容 |
‘self’ | 容许来自相同来源的内容(相同的协议、域名和端口) |
data: | 容许 data: 协议(如 base64 编码的图片) |
www.Google.com | 容许加载指定域名的资源 |
*.Google.com | 容许加载 Google.com 任何子域的资源 |
‘unsafe-inline’ | 容许使用内联资源,如内联的 <script> 元素、javascript: URL、内联的事件处理函数和内联的 <style> 元素.两侧单引号是必须的. |
‘unsafe-eval’ | 容许使用eval() 等经过字符串建立代码的方法。两侧单引号是必须的。 |
上面是个人一些粗浅的总结,但愿对你们有所帮助.若是文中有何不当之处请予以斧正,谢谢.
参考资料:
个人我的网址: wangyiming.info