Подтвердить что ты не робот

Какие проблемы с сериализацией 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]);
}

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

4b9b3361

Ответ 1

Я не могу сказать вам мотивы PayPal, но я могу догадаться: 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, и некоторые люди предпочитают устанавливать его на & вместо &. Paypal не может знать, что вы предпочитаете, и, очевидно, всегда будет использовать & http://php.net/manual/en/ini.core.php#ini.arg-separator.input

Кроме того, несмотря на то, что это плохая практика, в php для библиотек/библиотек не так уж редко встречается возможность автоматического изменения входных данных запроса, таких как $_POST, например, для "дезинфекции" их или других подобных проблем с перекрестными разрезами.

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