Пример кода 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
, например, для «дезинфекции» их или других подобных проблем с перекрестными разрезами.
Разбирая ввод вручную, вы избегаете всех этих потенциальных проблем. Это решение похоже на хорошую технику с их стороны.