PayPal PHP IPN示例所指的POST序列化问题是什么?

Jas*_*lor 12 php paypal-ipn

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]);
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个评论所指的序列化问题吗?虽然我可以这样做,但我知道为什么应该这样做,我会感觉更舒服.

goa*_*oat 12

我无法告诉你paypals的动机,但我可以猜到:php喜欢从http请求更改传入变量的键.

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

此外,php将在变量名称中将格式良好的匹配括号解析为嵌套数组.例如,arr[a][b]会显示为$_POST['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不知道你喜欢哪个,显然总是使用& http://php.net/manual/en/ini.core.php#ini.arg-separator.input

此外,尽管是不好的做法,但在PHP中代码/库自动修改请求输入并不常见$_POST,例如xss"清理"它们或其他此类交叉问题.

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

  • 很棒的答案.感谢您的参考! (2认同)