Using CSP violation reports
草案
本页尚未完工.
CSP其中的一个强大的特性是它为web站点管理员提供了生成和报告详细的站点攻击的描述信息。这些报告通过HTTP的POST请求发送到预先你指定的一个或多个服务器上,这些服务器可以通过 report-uri
策略来制定。发送的报告是JSON格式的,对于非ASCII字符,其使用了默认的JSON UTF-8编码。本文将向你展示如何在你的站点上配置报告,以及报告的格式。
对于支持CSP的浏览器,只要你制定了合法的 report-uri
指令,任何违背该策略的攻击操作都会被浏览器所报告。
开启报告
默认情况下,攻击是不会被报告的。要开启报告模式,你要指定 report-uri
指令,这个指令包含了至少一个用于接收报告的URI:
Content-Security-Policy: default-src self; report-uri http://reportcollector.example.com/collector.cgi
然后,你要搭建接受报告的服务器;它可以对报告进行存储和并进行适时的处理。
注意:Firefox 23以前的版本所使用的报告头为 X-Content-Security-Policy。这个头在将来将被废弃。
攻击报告的语法
报告的JSON对象包含了以下的数据:
document-uri
- 当前攻击所发生的文档的URI。
referrer
- 当前攻击所发生的文档的来源页面的URI。
blocked-uri
- 被CSP策略所拦截的资源的URI。如果被拦截资源的URI属于与当前文档不同的来源,则所拦截的资源URI会被削减至只剩scheme,host和port三部分。
violated-directive
- 攻击所针对的策略部分的名称
original-policy
- 由X-Content-Security-Policy头指定的原始策略。
Sample violation report
攻击报告的样例
在CSP规范中,已经有一个样例展示攻击报告。这里我们来看另一个例子。
假设有一个页面叫做http://example.com/signup.html. 它使用了一下的策略,它禁止从除cdn.example.com以外的域加载样式表。
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
signup.html的HTML则像下面这样:
<!DOCTYPE html>
<html>
<head>
<title>Sign Up</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
... Content ...
</body>
</html>
看到问题了么?在策略中指明样式表只能从cdn.example.com加载,而这个页面则试图从它本域(http://example.com)下载样式表. 浏览器基于强制CSP的开启,在这个页面被访问时,将以下的报告通过POST请求发送到 http://example.com/_/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" } }
我们可以看到,这个报告在blocked-uri中包含了错误资源的整个路径。而这并非总是这样。例如,当signup.html试图从http://anothercdn.example.com/stylesheet.css
加载css的时候,浏览器只会记录来源(http://anothercdn.example.com)而不会记录完整的路径。CSP规范中对这一行为进行了解释。总结一下,CSP的作用是放置跨域信息的泄露。值得注意的是,规范中的 攻击报告范例 有一处错误(其中blocked-uri应该是"http://evil.example.com")。