从第三方检索应用程序/ x-www-form-urlencoded中检索数据

时间:2014-03-12 10:15:03

标签: php forms post get urlencode

我正在尝试从第三方提供商处检索数据。他们通过Content-Type: application/x-www-form-urlencoded向我们发送数据。最后,我们解析$_POST$_GET变量中的数据,如下所示:

print_r($_POST);
print_r($_GET);

数组是空的:

Array
(
)

Array
(
)

我也尝试使用file_get_contents('php://input')获取数据,但它会打印一个空字符串。

检查$_SERVER变量,我们注意到content-type确实是application/x-www-form-urlencoded,而REQUEST_METHOD确实是POST

有没有人指出我们可以访问所发送数据的位置?

(我们通过使用RequestBin中的网址更改网址并查看其中的数据,确保问题出在我们手中。)

修改

我们使用http://requestb.in切换网址时得到的回复:

amount: 2200
pay_from_email: [REDACTED]
lma_transaction_id: [REDACTED]
md5sig: [REDACTED]
transaction_id: 761
merchant_fields: cart_id
lma_amount: 2200
status: 2
pay_to_email: [REDACTED]
cart_id: 11242
merchant_id: [REDACTED]

请求的标头是:

X-Request-Id: [REDACTED]
User-Agent: [REDACTED]
Connection: close
Content-Type: application/x-www-form-urlencoded
Host: requestb.in
Content-Length: 326

修改
var_dump(getallheaders());打印:

[User-Agent] => [REDACTED] (Name of the third-party provider)
[Content-Type] => application/x-www-form-urlencoded
[Host] => [REDACTED]

修改 apache_request_headers()打印:

[Host] => [REDACTED]
[DNT] => 1
[Cookie] => [REDACTED]
[Connection] => keep-alive
[Accept] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.74.9 (KHTML, like Gecko) Version/7.0.2 Safari/537.74.9
[Accept-Language] => fr-fr
[Accept-Encoding] => gzip, deflate
[Cache-Control] => max-age=0

2 个答案:

答案 0 :(得分:0)

确保,在php.ini中:

  • track_vars(仅在非常旧的PHP版本上提供)设置为On
  • variables_order包含字母P
  • post_max_size设置为 合理的价值(例如8 MB)
  • 如果使用suhosin补丁:suhosin.post.max_varssuhosin.request.max_vars很大 足够
  • 尝试前置" www。"到发布到的URL。

答案 1 :(得分:0)

我的回答不是一个解决方案,而是你所问的指针。

这些是您提到的事实:

  1. 您已通过检查$_SERVER['REQUEST_METHOD']确认请求处于POST状态。
  2. 当浏览器提交普通的POST表单时,您的脚本可以正常工作。
  3. 将请求发送到requestb.in时,会出现Content-Length标头。
  4. 第三方发送请求时,找不到相同的Content-Length标头。
  5. 不幸的是,如果没有Content-Length,我就无法发送POST请求,所以我不知道这是否真的是你问题的根源。它完全取决于Apache + PHP,如果这个标头不可用,我该如何反应,我无法找到任何地方说如果POST请求没有附带会发生什么。没有它,PHP无法构造$ _POST数组,但这只是猜测。

    无论如何,将此标头发送到requestb.in但不是您的脚本的事实是我们需要关注的全部内容。当我有新的话要说时,我会更新我的答案,但现在这就是全部。

    <强> [UPDATE]

    使用NetTool我设法测​​试了不同的标头组合,并且PHP无法填充$ _POST数组的唯一情况是请求确实有Content-Type标头。即使这样,file_get_contents('php://input')也会显示原始传入的帖子数据。

    回到Content-Length,NetTool允许我省略此标题而不发送它,但无论是否发送,PHP脚本都会在请求中显示此标头的存在!我不确定它是否真的没有被发送,在这种情况下,Apache在填充PHP之前填补空白,或者NetTool在没有告诉我的情况下发送它。

    只有可以调试问题的方法是使用mod_dumpio在传入PHP之前转储所有传入的帖子数据。这样,您可以确定传入的请求是否实际包含任何数据,或者它是否为空。

    <强> [UPDATE]

    最后,我设法使用NetTool的隧道功能来监控随请求发送的实际标头。不幸的是,即使我告诉NetTool不发送Content-Length它仍会发送。在我看来,它是不可避免的。在这种情况下,它也可能是您的问题的原因。我的意思是如果这个标题不存在,那么PHP可能无法构造$ _POST数组。