Една полезна функция на Правила за сигурност на съдържанието е възможност за откриване на нарушения и изпращането му до конкретен URI като (Доклад за нарушение). Според документация от CSP 1.1 Sec. 3.2.4 Докладване:
За да изпрати доклади за нарушения, потребителският агент трябва да използва алгоритъм, еквивалентен на следния:
- Извличане на URI на отчета от произхода на защитения ресурс, с ненастроен синхронен флаг, чрез HTTP метод POST, с поле за заглавка Content-Type на application/json с тяло на обект, състоящо се от тяло на отчет. Ако произходът на URI на отчета не е същият като произхода на защитения ресурс, флагът за блокиране на бисквитките също трябва да бъде зададен. Потребителският агент не трябва да следва пренасочвания, когато извлича този ресурс. (Забележка: Потребителският агент игнорира извлечения ресурс.)
След това в раздел 5.2 Примерен доклад за нарушение е даден пример:
В следващия пример потребителският агент изобрази представяне на ресурса http://example.org/page.html със следната CSP политика:
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 е плюс.