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]); }
有人可以解释这个评论引用的序列化问题吗?虽然我可以这样做,我会觉得更加舒服,知道为什么应该这样做.
我不能告诉你支付宝的动机,但我可以猜测:PHP喜欢从http请求更改输入变量的键.
例如,名称a.b [将显示为$_POST [‘a_b__’]. PHP将用下划线替换空格,圆点和打开括号:
来源: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设置,有些人喜欢将其设置为& amp; amp; amp;而不是只是&贝宝不知道你喜欢什么,显然总是使用&
http://php.net/manual/en/ini.core.php#ini.arg-separator.input
另外,尽管做错了,但在PHP代码/库中自动修改诸如$_POST的请求输入,例如xss“清理”它们或其他这样的交叉问题并不常见.
通过手动解析输入,您可以避免所有潜在的问题.这个决定看起来好像是很好的工程.