2012-12-23 5 views
12

PayPal-Beispielcode für einen Zuhörer PHP IPN hat diesen Kommentar/Code oben:Auf welche POST-Serialisierungsprobleme bezieht sich das Beispiel von 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]); 
} 

Kann jemand erklären, was Serialisierung Probleme dieser Kommentar bezieht sich auf? Während ich es so mache, würde ich mich wohler fühlen, wenn ich weiß, warum es so gemacht werden sollte.

+0

Nicht sicher, was das im Zusammenhang bedeutet, aber '$ _POST' enthält nicht immer das gleiche wie' php: // input'. Zum Beispiel: 'key = val1 & key = val2' führt nur zu einem Eintrag für' key' im Array '$ _POST'. Und auch "php: // input" ist schreibgeschützt, während "$ _POST" nicht lesbar ist. –

+0

Mit Blick auf eine Testseite, die ich aufgestellt habe, würde das '$ raw_post_array' tatsächlich beide' Schlüssel' Einträge in einem indizierten Array enthalten. Der Rest des Beispielcodes analysiert jedoch die Rohdaten in einem Array. Vergleicht man die beiden Arrays, so ist ihr benutzerdefiniertes Array '$ myPost' identisch mit $ _POST. zB: den zuletzt deklarierten '$ key = 'val2'' zu behalten. –

+0

Warum in der * Welt tun sie das, anstatt nur ['parse_str'] (http://php.net/parse_str) zu verwenden? Könnten sie sich auf etwas Seltsames beziehen, das es tut? Es verwendet den gleichen Code, der '$ _GET' und' $ _POST 'schließlich generiert ... – Charles

Antwort

11

Ich kann Dir die Motivationen von Paypals nicht sagen, aber ich kann es mir denken: php möchte die Schlüssel von eingehenden Variablen von einer HTTP-Anfrage ändern. Der Name a.b [ würde beispielsweise als $_POST['a_b__'] angezeigt werden. PHP ersetzt Räume, Punkte und offene Klammern mit Unterstrichen: Quelle: http://php.net/manual/en/language.variables.external.php

Außerdem wird auch in PHP Variablennamen in verschachtelter Arrays gebildet passende Klammern parsen. zB würde arr[a][b] als $_POST['a']['b'] angezeigt werden. http://php.net/manual/en/faq.html.php#faq.html.arrays

Auch verhält sich PHP alle Arten von verrückten und Buggy, wenn Klammern sind nicht gut gebildet: https://bugs.php.net/bug.php?id=48597

Auch magic_quotes_gpc verwendet seinen Talons in jede PHP-Installation zu haben, die Namen von Variablen in bestimmten Ändern Fälle auch. http://php.net/manual/en/security.magicquotes.php

Auch PHP hat die arg_seperator.input Einstellung, und manche Leute mögen diese stattdessen & von nur & einzustellen. Paypal kann nicht wissen, was Sie wollen, und würde natürlich verwenden immer & http://php.net/manual/en/ini.core.php#ini.arg-separator.input

Auch obwohl sie schlechte Praxis, ist es nicht zu selten in PHP für Code/Bibliotheken, um automatisch die Anforderungseingaben zu ändern, wie $_POST, zB XSS " sanieren "sie oder andere solche übergreifenden Bedenken.

Durch die manuelle Analyse der Eingabe vermeiden Sie all diese potenziellen Probleme. Diese Entscheidung scheint eine gute Ingenieurleistung zu sein.

+2

Fantastische Antwort. Danke auch für die Referenzen! –

+0

Gute Antwort. Macht jetzt Sinn. –