php: // input <> $ _POST? - PullRequest
       17

php: // input <> $ _POST?

4 голосов
/ 16 января 2011

Я экспериментирую с политикой безопасности контента Firefox.По сути, это специальный заголовок для веб-страницы, который сообщает браузеру, какие ресурсы являются действительными.

Когда какой-либо ресурс является недействительным из-за нарушения политики, Firefox отправляет отчет на указанный URI в формате json.1004 * Это типичный отчет

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;charset = UTF-8

Сейчас.Я ожидаю, что это будет доступно в $ _POST как REQUEST_METHOD == POST, но запись всегда пуста.Я могу получить к нему доступ из php: // input, но возникает вопрос: почему запрос не доступен в $ _POST?

Я даже не могу использовать filter_input, а $ _REQUEST пусто ...

Ответы [ 3 ]

8 голосов
/ 16 января 2011

Если запрос отправлен как 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
8 голосов
/ 16 января 2011

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

1 голос
/ 16 января 2011

Это может быть несколько других типов http-запросов (я знаю о 7 прямо сейчас, и несколько заполнителей, чтобы получить больше).
Я бы напечатал $_REQUEST и $_SERVER, чтобы увидеть, как это на самом делеприбывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...