12

PHP IPNリスナー用のPayPalのサンプルコードの上部には、次のコメント/コードがあります。

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

このコメントが言及しているシリアル化の問題を誰かが説明できますか?私はこのようにそれを行っても大丈夫ですが、なぜそれがこのように行われるべきかを知っているとより快適に感じるでしょう。

4

1 に答える 1

13

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 や投稿本文を作成するときに常に使用するため、php エンジンがパラメーターを間違って解析する原因となります。 http://php.net/manual/en/ini.core.php#ini.arg-separator.input

また、悪い慣習であるにもかかわらず、コード/ライブラリが などのリクエスト入力を自動的に変更することは php ではそれほど珍しいことではありません$_POST。$_POST は書き込み可能/変更可能な変数ですが、php://input は読み取り専用であるため、ライブラリによっていじられないことが保証されています。

入力を手動で解析することで、これらの潜在的な問題をすべて回避できます。この決定は、彼らにとって優れたエンジニアリングのように思えます。

于 2012-12-23T02:41:11.213 に答える