【问题标题】:php://input contains data for a GET requestphp://input 包含 GET 请求的数据
【发布时间】:2013-12-19 22:13:22
【问题描述】:

我在 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);
}

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

【问题讨论】:

    标签: php apache2


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      相关资源
      最近更新 更多