七 CSP阐发陈述
对网站治理员来讲CSP的一个强大年夜功能是它可以产生试图报复打击你网站的阐发陈述。你可以用report-uri指令使浏览器发送HTTP POST要求把报复打击陈述以JSON格局传送到你指定的地址。接下来给大年夜家介绍你的站点若何建设来领受报复打击陈述。
1. 启用陈述
默许环境下,背规陈述不会发送。为了能利用背规陈述,你必需利用report-uri指令,并起码供给一个领受地址。
Content-Security-Policy: default-src self; report-uri
http://reportcollector.example.com/collector.cgi
假定想让浏览器只报告请示陈述,不禁止任何内容,可以改用Content-Security-Policy-Report-Only头。
2.背规陈述语法
该陈述JSON对象包含以下数据:
blocked-uri:被禁止的背规资本
document-uri:反对背规行动产生的页面
original-policy:Content-Security-Policy头策略的所有内容
referrer:页面的referrer
status-code:HTTP响应状况
violated-directive:背规的指令
3.背规陈述例子
http://example.com/signup.html 中CSP 划定只能加载cdn.example.com的CSS样式。
Content-Security-Policy: default-src 'none'; style-src
cdn.example.com; report-uri /test/csp-report.php
signup.html中的代码近似与如许:
... Content ...
你能从上面的代码找犯弊端吗?策略是只承诺加载cdn.example.com中的CSS样式。但signup.html试图加载本身域的style.css样式。如许背反了策略,浏览器会向
http://example.com/test/csp-report.php 发送POST要求提交陈述,发送格局为JSON格局。
{
"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",
}
}
你从上面可以看到blocked-uri给出了具体的阻断地址http://example.com/css/style.css,但也其实不是每次都是如许。好比试图从http://anothercdn.example.com/stylesheet.css 加载CSS样式时,浏览器将不会传送完全的路径,只会给出http://anothercdn.example.com/这个地址。如许做是为了不泄漏跨域的敏感信息。
办事端csp-report.php代码可以如许写:
$file = fopen('csp-report.txt', 'a');
$json = file_get_contents('php://input');
$csp = json_decode($json, true);
foreach ($csp['csp-report'] as $key => $val) {
fwrite($file, $key . ': ' . $val . "
");
}
fwrite($file, 'End of report.' . "
");
fclose($file);
?>
八 CSP的利用率统计
CSP的全球范围利用率很是低,并且增加的也很是迟缓。按照Veracode在2013年11月给出的陈述指出,全球前1000000网站中独一269个网站利用了W3C规范的CSP策略头Content-Security-Policy。584个网站在利用X-Content-Security-Policy策略头和487个网站在利用X-Webkit-CSP策略头,这两个和谈头已被烧毁,但还没有被禁用。
而利用Content-Security-Policy-Report-Only进行伶仃领受报复打击陈述的网站只有24个。而统计中也指出,发现大年夜量网站利用unsafe-inline这个指令,阐发其启事多是因为开辟人员很难在页面中完全消弭内联脚本,这很让人掉看,所有只能要求拟定的CSP策略加倍严谨。
http://blog.veracode.com/2013/11/security-headers-on-the-top-1000000-websites-november-2013-report/
对国内网站利用CSP的环境,笔者拜托ZoomEye对此进行了统计。2014年2月发来的统计成果在很是不乐不雅。按照ZoomEye的统计:国内排名前7000的域名没有益用CSP,国内1千万的域名(含子域名)中发现7个利用了CSP策略,此中还有3个网站CSP语法利用弊端。7个网站中3个网站是知乎,知乎网站值得表扬。
列表以下:
www.zhihu.com
www.zhi.hu
zhimg.com
www.applysquare.com
www.pipapai.com CSP语法弊端
www.icyprus.cn CSP语法弊端
www.uyitec.cn CSP语法弊端
在网站安然防御方面,我们还要有很长的路要走。当然CSP安然策略头只是网站安然整体防御中的一小部门,但合理的操纵仍是可以起到很好的防护感化。但是在我们阐发的百万网站中,CSP的利用率是极其的低,从这一点来讲CSP在国内就应当遍及的给网站治理员进行科普。
九 CSP Bypass
一个安然策略从出世开端将会时不时的有一个叫“Bypass”的小火伴跟从摆布。而从辩证角度来讲,多加载一种安然策略,就多了一种Bypass的维度。一旦Bypass呈现,就意味着将有一种设计者没有考虑到的编制或技能,将粉碎策略的原有法则。
CSP也亦是如斯,在一次次被绕过然后在一次次修复过程中,来完美本身的语法和指令。
1.bypass AngularJS系列绕过
AngularJS是为数不多的撑持CSP模式的MVC框架,在夙起版本中可以机关多种编制绕过CSP防御。
CSP Bypasses with AngularJS 1.0.8 and 1.1.5
例如:XSS via Click & Hover (ng-click & ng-mou搜刮引擎优化ver attribute)
header('X-Content-Security-Policy: default-src 'self' ajax.谷歌apis.com');
header('Content-Security-Policy: default-src 'self' ajax.谷歌apis.com');
header('X-Webkit-CSP: default-src 'self' ajax.谷歌apis.com');
header('Set-Cookie: abc=123');
?>
Click me
Hover me
更多的可以看https://code.谷歌.com/p/mustache-security/wiki/AngularJS
2.策略优先级绕过
在浏览器的呵护策略中,有良多是反复的。好比A策略可以抵抗C报复打击,B策略也能够抵抗C报复打击。此处的抵抗可所以阻断也能够是放行。因而当AB同时感化于C报复打击上时,Bypass便可能产生。
(1)Iframe sandbox 和 CSP sandbox
当iframe sandbox承诺履行JS,而CSP不承诺履行JS,标题问题就产生了,CSP就被bypass了。
//evil.com