我正在试验Firefox的内容安全政策。基本上它是网页的一个特殊标题,告诉浏览器哪些资源是有效的。
当某些资源因为违反政策而无效时,Firefox会以json格式向给定的URI发送报告。
这是典型的报告
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为空...
答案 0 :(得分:8)
$_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 :(得分:8)
如果请求以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
答案 2 :(得分:1)
它可以是其他几种http请求类型(我现在知道7个,还有几个占位符供更多人使用)。
我会打印$_REQUEST
和$_SERVER
,看看它是如何到达的。