php:// input包含GET请求的数据

时间:2013-12-19 22:13:23

标签: php apache2

我在Linux上运行Apache2和PHP 5,我在php://input流中遇到了一些奇怪的行为。

对于某些GET请求,流不应该是空的。相反,php://input流包含整个GET请求。我已经解决了这个问题,但我想知道我是否应该提交一个关于此问题的错误,或者是否是“希望但没有记录”的行为。

详细信息

在请求处理的早期,我打电话给:

$in = file_get_contents('php://input');
if ( !empty($in) )
    $post_data = json_decode($in);

if ( !empty($in) && is_null($post_data) ) {
    // output some error info and exit
}

通常当请求没有正文时,$in为空,并且所有对象都是正确的。但有时 GET请求会有一个正文,而该正文将是整个请求。当然你不能对这些数据进行json解码,并且错误条件会受到影响。

仅在某些请求时才会发生这种情况。例如,此请求不会出现错误:

GET /os/invitations/kkkkkk HTTP/1.1
Host: our.machine.com
Content-Type: application/json
Authorization: Basic aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa==

但是这个通过一些代理和VPN路由的请求确实会触发错误。

GET http://some.proxy.at.some.big.company.com:7080/cvp-out/cmmproxy/os/invitations/d66065566dba541c8ba6a70329684645 HTTP/1.1
Content-Type: application/json
Authorization: Basic aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa==
Clientid: abc
User-Agent: Java/1.6.0
Host: some.proxy.at.some.big.company.com:7080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
X-Remote-Addr: 53.231.244.171
X-Remote-Host: 53.231.244.171
X-Server-Name: some.proxy.at.some.big.company.com
X-Server-Port: 7080
X-Scheme: http

我花了小时将此视为路由/调度问题,但结果却是我们的代码。当然,修复只是在您期待数据时才从输入流中读取:

if ( in_array( $_SERVER['REQUEST_METHOD'], array('PUT', 'POST') )) {
    $in = file_get_contents('php://input');
    if ( !empty($in) )
        $post_data = json_decode($in);
}

这是一个已知问题吗?这是不可预测的吗?我应该提交错误吗?

1 个答案:

答案 0 :(得分:1)

据我所知,这不是错误。我们知道GET请求不应该有一个正文,但是在php://的文档中,他们没有说任何类型的请求会产生输入,所以它可以是任何方法。并且肯定它不仅限于POST,因为至少提到了PUT和PROPFIND。

无论如何,你的解决方案是必须的。