Какие проблемы с сериализацией POST ссылаются на пример IP-адреса PayPal PHP?

Пример кода 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]); } 

Может ли кто-нибудь объяснить, к какой проблеме сериализации относится этот комментарий? Хотя я в порядке делаю это так, я бы чувствовал себя более комфортно, зная, почему так должно быть сделано.

Я не могу сказать вам мотивы PayPal, но я могу догадаться: php любит менять ключи входящих переменных с HTTP-запроса.

Например, имя ab [ будет отображаться как $_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 , например, для «дезинфекции» их или других подобных проблем с перекрестными разрезами.

Разбирая ввод вручную, вы избегаете всех этих потенциальных проблем. Это решение похоже на хорошую технику с их стороны.