12

PayPal 的 PHP IPN 侦听器示例代码在顶部有以下注释/代码:

// reading posted data from directly from $_POST causes serialization 
// issues with array data in POST
// reading raw POST data from input stream instead. 
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
  $keyval = explode ('=', $keyval);
  if (count($keyval) == 2)
     $myPost[$keyval[0]] = urldecode($keyval[1]);
}

有人可以解释此评论所指的序列化问题吗?虽然我可以这样做,但如果知道为什么要这样做,我会感到更自在。

4

1 回答 1

13

我不能告诉你贝宝的动机,但我可以猜到:php 喜欢更改来自 http 请求的传入变量的键。

例如,名称a.b [将显示为$_POST['a_b__']。php 将用下划线替换空格、点和左括号:来源: http: //php.net/manual/en/language.variables.external.php

此外,php 会将变量名中格式良好的匹配括号解析为嵌套数组。例如,arr[a][b]将显示为$_POST['arr']['a']['b']. http://php.net/manual/en/faq.html.php#faq.html.arrays

此外,当括号格式不正确时,php 会表现出各种疯狂和错误: https ://bugs.php.net/bug.php?id=48597

此外,magic_quotes_gpc曾经在每个 php 安装中都有它的爪子,在某些情况下也会更改变量的名称。http://php.net/manual/en/security.magicquotes.php

此外,php 有arg_seperator.input设置,有些人喜欢将其设置为&而不是&. Paypal 无法知道您喜欢哪个,并且显然&在制作 url 和/或 post body 以请求时总是使用,导致您的 php 引擎解析参数错误。 http://php.net/manual/en/ini.core.php#ini.arg-separator.input

此外,尽管是不好的做法,但在 php 中,代码/库自动修改请求输入的情况并不少见$_POST,例如 xss “清理”它们或其他此类横切关注点。$_POST 是一个可写/可修改的变量,而 php://input 是只读的,所以它保证不会被库弄乱。

通过手动解析输入,您可以避免所有这些潜在问题。这个决定对他们来说似乎是一个很好的工程。

于 2012-12-23T02:41:11.213 回答