コンテンツ セキュリティ ポリシーの便利な機能の 1 つは、違反を検出し、それを (違反レポート) として特定の URI に送信する機能です。CSP 1.1 Secのドキュメントによると。3.2.4 レポート:
違反レポートを送信するには、ユーザー エージェントは次と同等のアルゴリズムを使用する必要があります。
- 同期フラグを設定せずに、HTTP メソッド POSTを使用して、保護されたリソースのオリジンからレポート URI をフェッチし、レポート ボディで構成されるエンティティ ボディを持つ application/json の Content-Type ヘッダー フィールドを指定します。レポート 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"
}
}
例:
test.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 をデコードする方法を提供することもプラスです。