2012-12-23 17 views
12

przykładowy kod PayPal dla słuchacza PHP IPN ma ten komentarz/kod na górze:Jakie problemy z serializacją POST opisuje przykład PHP 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]); 
} 

Może ktoś wyjaśnić jakie kwestie serializacji ten komentarz odnosi się do? Chociaż robię to w ten sposób, czułbym się bardziej komfortowo wiedząc, dlaczego tak powinno być.

+0

Nie jestem pewien, co to oznacza w kontekście, ale '$ _POST' nie zawsze zawiera to samo co' php: // input'. Na przykład: 'key = val1 & key = val2' spowoduje tylko jedną pozycję dla' key' w tablicy '$ _POST'. Ponadto, 'php: // input' jest tylko do odczytu, natomiast' $ _POST' nie jest. –

+0

Patrząc na stronę testową, którą podniosłem, na pewno '$ raw_post_array' zawierałby wpisy" key "w tablicy indeksowanej. Jednak reszta kodu przykładowego kończy przetwarzanie nieprzetworzonych danych do tablicy. Porównując dwie tablice, ich niestandardowa tablica 'myPost' jest identyczna z' $ _POST'. tj .: zachowywanie ostatniego zadeklarowanego '$ key = 'val2''. –

+0

Dlaczego w * świecie * czynią to zamiast używać tylko '' parse_str'? (Http://php.net/parse_str)? Czy mogą odnosić się do czegoś dziwnego? Używa tego samego kodu, który generuje '$ _GET' i' $ _POST' po wszystkim ... – Charles

Odpowiedz

11

Nie mogę podać motywów zapłaty, ale mogę zgadnąć: php lubi zmieniać klucze przychodzących zmiennych z żądania http.

Na przykład nazwa a.b [ pojawi się jako $_POST['a_b__']. php zastąpi przestrzenie, kropki i otwartych uchwytów podkreślenia: źródło: http://php.net/manual/en/language.variables.external.php

Również php przetworzy dobrze uformowanych dopasowania wsporniki w zmiennej nazwy w zagnieżdżonych tablic. np. arr[a][b] pojawi się jako $_POST['a']['b']. http://php.net/manual/en/faq.html.php#faq.html.arrays

Również php zachowuje wszystkie rodzaje szalony i buggy gdy wsporniki nie są dobrze uformowane: https://bugs.php.net/bug.php?id=48597

Również magic_quotes_gpc używane mieć swoje szpony w każdej instalacji php, zmiany nazw zmiennych w niektórych sprawy też. http://php.net/manual/en/security.magicquotes.php

Ponadto, php ma ustawienie arg_seperator.input, a niektórzy ludzie lubią ustawić to jako & zamiast tylko &. Paypal nie może wiedzieć, które wolisz, i oczywiście zawsze używać & http://php.net/manual/en/ini.core.php#ini.arg-separator.input

Ponadto, mimo że złych praktyk, to nie jest zbyt rzadkie w PHP/kod biblioteki automatycznie modyfikować wejść żądania takich jak $_POST, np XSS " dezynfekcji "ich lub innych takich problemów przekrojowych.

Parsując dane wejściowe ręcznie, unika się wszystkich potencjalnych problemów. Ta decyzja wydaje się dobrą inżynierią z ich strony.

+2

Fantastyczna odpowiedź. Dzięki za referencje! –

+0

Dobra odpowiedź. Teraz ma sens. –