Как да получа доклад за нарушение (JSON ДАННИ) за правилата за сигурност на съдържанието с помощта на PHP?

Една полезна функция на Правила за сигурност на съдържанието е възможност за откриване на нарушения и изпращането му до конкретен 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 е плюс.


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