Я экспериментирую с политикой безопасности контента Firefox. В основном это специальный заголовок для веб-страницы, который сообщает браузеру, какие ресурсы действительны.
Когда какой-то ресурс недействителен, так как он нарушает политику, Firefox отправляет отчет в заданный URI в формате json.
Это типичный отчет
array(1) { ["csp-report"]=> array(4) { ["request"]=> string(71) "GET http://example.com/?function=detail&id=565 HTTP/1.1" ["request-headers"]=> string(494) "Host: example.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0b10pre) Gecko/20110115 Firefox/4.0b10pre Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: es-ar,en-us;q=0.8,es;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Accept-Charset: UTF-8,* Keep-Alive: 115 Connection: keep-alive Referer: http://example.com/index.php?function=search&query=Pata+de+cambio+ Cookie: the cookie " ["blocked-uri"]=> string(4) "self" ["violated-directive"]=> string(30) "inline script base restriction" } }
Тип контента – application / json; кодировка = UTF-8
Теперь. Я ожидаю, что это будет доступно в $ _POST как REQUEST_METHOD == POST, но post всегда пуст. Я могу получить к нему доступ из ввода php: //, но возникает вопрос: почему запрос не доступен в $ _POST?
Я даже не могу использовать filter_input, а $ _REQUEST пуст …
$_POST
дает вам переменные формы, которые отображаются на странице следующим образом:
POST /some_path HTTP/1.1 myvar=something&secondvar=somethingelse
Но то, что вы получаете, не является допустимой строкой запроса. Вероятно, это выглядит примерно так:
POST /some_path HTTP/1.1 {'this':'is a JSON object','notice':'it\'s not a valid query string'}
php://input
дает вам все после заголовков в необработанном виде, поэтому в этом случае я думаю, что это единственный способ получить то, что вы хотите.
Если запрос отправляется как POST
он не обязательно кодируется как нормальное application/x-www-form-urlencoded
или multipart/form-data
. Если Firefox отправит тело JSON, PHP не знает, как его декодировать.
Вы должны проверить $_SERVER["HTTP_CONTENT_TYPE"]
. Если он содержит application/json
то вы действительно должны прочитать php: // stdin:
if (stripos($_SERVER["HTTP_CONTENT_TYPE"], "application/json")===0) { $_POST = json_decode(file_get_contents("php://input")); // or something like that
Это может быть несколько других типов запросов HTTP (сейчас я знаю 7, и несколько владельцев мест для большего количества прибывающих).
Я бы напечатал $_REQUEST
и $_SERVER
чтобы узнать, как он на самом деле прибывает.