Одна полезная функция политики безопасности контента — это возможность обнаруживать нарушения и отправлять их на определенный URI как (отчет о нарушении). Согласно документации из CSP 1.1 Sec. 3.2.4 Отчетность:
Для отправки отчетов о нарушениях пользовательский агент должен использовать алгоритм, эквивалентный следующему:
- Получить URI отчета из источника защищенного ресурса с неустановленным флагом синхронизации, используя HTTP-метод POST, с полем заголовка Content-Type application/json с телом объекта, состоящим из тела отчета. Если источник URI отчета не совпадает с источником защищенного ресурса, необходимо также установить флаг блокировки файлов cookie. Пользовательский агент не должен следовать перенаправлениям при получении этого ресурса. (Примечание: пользовательский агент игнорирует извлеченный ресурс.)
Затем в разделе 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, является плюсом.