PayPal PHP IPN 示例指的是哪些 POST 序列化问题?
Posted
技术标签:
【中文标题】PayPal PHP IPN 示例指的是哪些 POST 序列化问题?【英文标题】:What POST serialization issues does PayPal PHP IPN example refer to? 【发布时间】:2012-12-10 02:12:30 【问题描述】: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]);
有人能解释一下这条评论指的是什么序列化问题吗?虽然我可以这样做,但如果知道为什么要这样做,我会更自在。
【问题讨论】:
不确定这在上下文中意味着什么,但$_POST
并不总是包含与php://input
相同的内容。例如:key=val1&key=val2
将导致key
在$_POST
数组中只有一个条目。而且,php://input
是只读的,而 $_POST
不是。
查看我放置的测试页面,果然$raw_post_array
将包含两个key
条目,在一个索引数组中。但是,示例代码的其余部分最终将原始数据解析为数组。比较这两个数组,它们的自定义$myPost
数组与$_POST
相同。即:保留最后声明的$key = 'val2'
。
为什么在世界中他们这样做而不是仅仅使用parse_str
?他们可能指的是它所做的一些奇怪的事情吗?毕竟,它使用生成$_GET
和$_POST
的相同代码...
示例代码将是最糟糕的!
我在 paypal 找到的一些代码是多余的。您可以使用if(get_magic_quotes_gpc())
和curl_setopt_array()
。
【参考方案1】:
我无法告诉你 paypal 的动机,但我可以猜到: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
)并不少见,例如对它们进行“清理”或其他此类横切问题。 $_POST 是一个可写/可修改的变量,而 php://input 是只读的,所以保证不会被库弄乱。
通过手动解析输入,您可以避免所有这些潜在问题。这个决定对他们来说似乎是一项很好的工程。
【讨论】:
很棒的答案。也感谢您的参考! 好答案。现在说得通了。 谢谢。让我也很困惑。以上是关于PayPal PHP IPN 示例指的是哪些 POST 序列化问题?的主要内容,如果未能解决你的问题,请参考以下文章
PayPal IPN HTTP 错误 400 - PHP - 使用 PayPal GIT 代码