php: // input <> $ _POST?

Я экспериментирую с политикой безопасности контента 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 чтобы узнать, как он на самом деле прибывает.