php: // input $ _POST?

Estoy experimentando con la Política de seguridad de contenido de Firefox. Básicamente es un encabezado especial para la página web que le dice al navegador qué recursos son válidos.

Cuando algún recurso no es válido porque rompe la política, Firefox envía un informe a un URI determinado en formato json.

Este es un informe típico

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" } } 

El tipo de contenido es application / json; charset = UTF-8

Ahora. Esperaría que esté disponible en $ _POST como REQUEST_METHOD == POST pero la publicación siempre está vacía. Puedo acceder desde php: // input, pero la pregunta es: ¿Por qué la solicitud no está disponible en $ _POST?

Ni siquiera puedo usar filter_input y $ _REQUEST está vacío …

$_POST le da variables de formulario, que aparecen en la página de esta manera:

 POST /some_path HTTP/1.1 myvar=something&secondvar=somethingelse 

Pero lo que está obteniendo no es una cadena de consulta válida. Probablemente se ve algo como esto:

 POST /some_path HTTP/1.1 {'this':'is a JSON object','notice':'it\'s not a valid query string'} 

php://input te da todo después de los encabezados en formato raw, así que en este caso creo que es la única manera de obtener lo que quieres.

Si una solicitud se envía como POST , no necesariamente se codifica como la application/x-www-form-urlencoded normal application/x-www-form-urlencoded o multipart/form-data . Si Firefox envía un cuerpo JSON, PHP no sabe cómo decodificarlo.

Debes marcar $_SERVER["HTTP_CONTENT_TYPE"] . Si contiene application/json entonces debes leer php: // stdin:

 if (stripos($_SERVER["HTTP_CONTENT_TYPE"], "application/json")===0) { $_POST = json_decode(file_get_contents("php://input")); // or something like that 

Puede tratarse de varios otros tipos de solicitud http (conozco 7 en este momento y varios marcadores de posición para ver más).
$_REQUEST y $_SERVER para ver cómo realmente llega.