内容安全策略(CSP)详解

内容安全策略(CSP),其核心思想十分简单:网站通过发送一个 CSP 头部,来告诉浏览器什么是被授权执行的与什么是需要被禁止的。其被誉为专门为解决XSS攻击而生的神器。

1.CSP是什么

CSP指的是内容安全策略,为了缓解很大一部分潜在的跨站脚本问题,浏览器的扩展程序系统引入了内容安全策略(CSP)的一般概念。这将引入一些相当严格的策略,会使扩展程序在默认情况下更加安全,开发者可以创建并强制应用一些规则,管理网站允许加载的内容。简单来说,就是我们能够规定,我们的网站只接受我们指定的请求资源。

2. CSP的意义##

防XSS等攻击的利器。CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

3.CSP的分类

(1)Content-Security-Policy
配置好并启用后,不符合 CSP 的外部资源就会被阻止加载。
(2)Content-Security-Policy-Report-Only
表示不执行限制选项,只是记录违反限制的行为。它必须与report-uri选项配合使用。

4.CSP的使用

(1)在HTTP Header上使用(首选)

"Content-Security-Policy:" 策略
"Content-Security-Policy-Report-Only:" 策略

   
   
  • 1
  • 2

(2)在HTML上使用

<meta http-equiv="content-security-policy" content="策略">
<meta http-equiv="content-security-policy-report-only" content="策略">

   
   
  • 1
  • 2

Meta 标签与 HTTP 头只是行式不同而作用是一致的,如果 HTTP 头与 Meta 定义同时存在,则优先采用 HTTP 中的定义。
如果用户浏览器已经为当前文档执行了一个 CSP 的策略,则会跳过 Meta 的定义。如果 META 标签缺少 content 属性也同样会跳过。

5.策略应该怎么写

(1)举个例子

// 限制所有的外部资源,都只能从当前域名加载
Content-Security-Policy: default-src 'self'

   
   
  • 1
  • 2
// default-src 是 CSP 指令,多个指令之间用英文分号分割;多个指令值用英文空格分割
Content-Security-Policy: default-src https://host1.com https://host2.com; frame-src 'none'; object-src 'none'  

   
   
  • 1
  • 2
// 错误写法,第二个指令将会被忽略
Content-Security-Policy: script-src https://host1.com; script-src https://host2.com

// 正确写法如下
Content-Security-Policy: script-src https://host1.com https://host2.com

  • 1
  • 2
  • 3
  • 4
  • 5
// 通过report-uri指令指示浏览器发送JSON格式的拦截报告到某个地址
Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser; 

// 报告看起来会像下面这样
{
“csp-report”: {
“document-uri”: “http://example.org/page.html”,
“referrer”: “http://evil.example.com/”,
“blocked-uri”: “http://evil.example.com/evil.js”,
“violated-directive”: “script-src ‘self’ https://apis.google.com”,
“original-policy”: “script-src ‘self’ https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser”
}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

(2)常用的CSP指令

指令指令和指令值示例指令说明
default-src‘self’ cdn.guangzhul.com默认加载策略
script-src‘self’ js.guangzhul.com对 JavaScript 的加载策略。
style-src‘self’ css.guangzhul.com对样式的加载策略。
img-src‘self’ img.guangzhul.com对图片的加载策略。
connect-src‘self’对 Ajax、WebSocket 等请求的加载策略。不允许的情况下,浏览器会模拟一个状态为 400 的响应。
font-srcfont.cdn.guangzhul.com针对 WebFont 的加载策略。
object-src‘self’针对 、 或 等标签引入的 flash 等插件的加载策略。
media-srcmedia.cdn.guangzhul.com针对媒体引入的 HTML 多媒体的加载策略。
frame-src‘self’针对 frame 的加载策略。
report-uri/report-uri告诉浏览器如果请求的资源不被策略允许时,往哪个地址提交日志信息。 特别的:如果想让浏览器只汇报日志,不阻止任何内容,可以改用 Content-Security-Policy-Report-Only 头。

(3)其他的CSP指令

指令指令和指令值示例指令说明
sandbox设置沙盒环境
child-src主要防御 <frame>,<iframe>
form-action主要防御 <form>
frame-ancestors主要防御 <frame>,<iframe>,<object>,<embed>,<applet>
plugin-types主要防御 <object>,<embed>,<applet>

(4)CSP指令值

指令值指令和指令值示例指令值说明
*img-src *允许任何内容。
‘none’img-src ‘none’不允许任何内容。
‘self’img-src ‘self’允许来自相同来源的内容(相同的协议、域名和端口)。
data:img-src data:允许 data: 协议(如 base64 编码的图片)。
www.guangzhul.comimg-src img.guangzhul.com允许加载指定域名的资源。
*.guangzhul.comimg-src *.guangzhul.com允许加载 guangzhul.com 任何子域的资源。
‘unsafe-inline’script-src ‘unsafe-inline’允许加载 inline 资源(例如常见的 style 属性,onclick,inline js 和 inline css 等等)。
‘unsafe-eval’script-src ‘unsafe-eval’允许加载动态 js 代码,例如 eval()。

6.支持问题

(1)CSP1兼容性
浏览器可以很好地支持 CSP 1,全球高达94.66%,中国达到79.55%(截至2018年4月12日)。
CSP1兼容性
(2)CSP2兼容性
CSP 2还很新,支持相对少点,全球达81.11%,中国达到60.04%(截至2018年4月12日)。
CSP2兼容性

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值