Как получить отчет о нарушении (ДАННЫЕ JSON) для политики безопасности контента с помощью PHP?

Одна полезная функция политики безопасности контента — это возможность обнаруживать нарушения и отправлять их на определенный 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, является плюсом.


person Community    schedule 13.08.2013    source источник


Ответы (1)


Я не эксперт по PHP, но тело POST — это просто кусок json, поэтому пары ключ-значение нет. Я предполагаю, что array_keys пуст. Я думаю, вы хотите json_decode($POST) http://php.net/manual/en/function.json-decode.php

Кроме того, похоже, что на ваш вопрос ответили в:

Публикация JSON в PHP (отчет CSP)

Примечание. Я ожидаю аналитического ответа, в котором будет указано, почему обычный пост не работает, какую альтернативу следует использовать и почему?

Я не уверен, о чем вы спрашиваете, но что касается «обычного» POST, в спецификации нет ничего, что диктовало бы, что содержимое тела сообщения должно быть парами ключ-значение. Кроме того, пара ключ/значение в традиционном понимании не является допустимым JSON.

Еще одна полезная страница: http://silex.sensiolabs.org/doc/cookbook/json_request_body.html

person oreoshake    schedule 13.08.2013
comment
Ваше право, лично я знал правильный ответ, который file_get_contents("php://input") не могли бы вы добавить больше деталей к своему ответу, это всего лишь сырой пост HTTP... - person ; 13.08.2013
comment
Какую информацию вы ищете? Какие вопросы у вас есть? - person oreoshake; 14.08.2013