php - PayPal PHP IPN 示例指的是哪些 POST 序列化问题?

标签 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]);
}

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

最佳答案

我无法告诉你 paypals 的动机,但我可以猜测: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 和/或帖子正文时显然总是使用 & ,导致您的 php 引擎解析错误的参数。 http://php.net/manual/en/ini.core.php#ini.arg-separator.input

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

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

关于php - PayPal PHP IPN 示例指的是哪些 POST 序列化问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14008067/

相关文章:

php - 使用 array_diff_assoc 比较两个数组

php - 从 3 个表中选择并在 div 中回显结果

paypal - paypal IPN 上的 txn_id 与买家在屏幕上显示的交易编号不同

PayPal IPN - 如果详细信息有误怎么办?

php - Paypal IPN 调用 - fsockopen 超时

php - 如何在 gettext 驱动的多语言站点上实现搜索?

php - 选择然后显示mysql行并告诉php它的值是什么?

php - 一次搜索多个表以查找值

python - 捕获 Django views.py 中的所有 URL 参数?

用于取消计费协议(protocol)的 Paypal IPN