内容安全策略的一项有用功能是能够检测违规并将其作为(违规报告)发送到特定的 URI。根据CSP 1.1 Sec 的文档。3.2.4 报告:
要发送违规报告,用户代理必须使用与以下等效的算法:
- 从受保护资源的来源获取报告 URI,未设置同步标志,使用HTTP 方法 POST,Content-Type 标头字段为 application/json,实体正文由报告正文组成。如果报告 URI 的来源与受保护资源的来源不同,则还必须设置块 cookie 标志。用户代理在获取此资源时不得遵循重定向。(注意:用户代理会忽略获取的资源。)
然后,在部分5.2 节示例违规报告中提供了一个示例:
在以下示例中,用户代理使用以下 CSP 策略呈现资源http://example.org/page.html的表示:
default-src 'self'; report-uri http://example.org/csp-report.cgi
受保护的资源从http://evil.example.com/image.png加载了一张图片 ,违反了政策。
{
"csp-report": {
"document-uri": "http://example.org/page.html",
"referrer": "http://evil.example.com/haxor.html",
"blocked-uri": "http://evil.example.com/image.png",
"violated-directive": "default-src 'self'",
"effective-directive": "img-src",
"original-policy": "default-src 'self'; report-uri http://example.org/csp-report.cgi"
}
}
例子:
测试.php
<?php
header("X-Content-Security-Policy: default-src 'self'; report-uri http://127.0.0.1/csp-report.php");
?>
<img src="http://evil.example.com/image.png">
csp-report.php
<?php
$content = "
Keys: ".implode("\n", array_keys($_POST))."\n
\n--------------------------\n\n
Values: ".implode("\n", $_POST)."\n
";
file_put_contents('csp-report.txt', $content, FILE_APPEND | LOCK_EX);
?>
csp-report.txt
Keys:
--------------------------
Values:
如您所见,该文件中没有保存任何内容!但是,使用 Firebug,报告似乎发送到该文件:
注意:我希望分析答案提到为什么正常帖子不起作用以及应该使用什么替代方案,为什么?此外,提供如何解码 JSON 也是一个优点。