Przekopałem się przez kilka postów na grupach dyskusyjnych na temat PHP Internals i znalazłem interesującą dyskusję na ten temat. Początkowy wątek był o czymś innym, ale uwaga Stefan Esser, a (jeśli nie ) ekspert bezpieczeństwa w świecie PHP okazało dyskusję wobec implikacji bezpieczeństwa za pomocą $ _REQUEST na kilka stanowisk.
Powołując się na Stefana Essera na temat PHP Internals
$ _REQUEST to jedna z największych słabości projektowych w PHP. Każda aplikacja używająca $ _REQUEST jest najprawdopodobniej podatna na problemy z fałszowaniem opóźnionych żądań między witrynami. (Zasadniczo oznacza to, że jeśli np. Istnieje plik cookie o nazwie (wiek), zawsze nadpisze zawartość GET / POST, a zatem niechciane żądania zostaną wykonane)
iw późniejszej odpowiedzi w tym samym wątku
Nie chodzi o to, że ktoś może sfałszować GET, POST; Zmienne COOKIE. Chodzi o to, że pliki COOKIE nadpiszą dane GET i POST w REQUEST.
Dlatego mogłem zainfekować twoją przeglądarkę ciasteczkiem, który mówi np. Action = logout i od tego dnia nie możesz już korzystać z aplikacji, ponieważ REQUEST [akcja] będzie wylogowywać się na zawsze (do momentu ręcznego usunięcia ciasteczka).
A zainfekowanie Cię plikiem COOKIE jest takie proste ...
a) Mogę użyć wulna XSS w dowolnej aplikacji na subdomenie
b) Czy kiedykolwiek próbowałeś ustawić plik cookie dla * .co.uk lub * .co.kr, gdy posiadasz pojedyncza domena?
c) Inne sposoby międzydomenowe ...
A jeśli uważasz, że to nie jest problem, mogę ci powiedzieć, że istnieje prosta możliwość ustawienia np. Pliku cookie * .co.kr, co powoduje, że kilka wersji PHP zwraca tylko białe strony. Wyobraź sobie: tylko jeden plik cookie, aby zabić wszystkie strony PHP w * .co.kr
I ustawiając niedozwolony identyfikator sesji w pliku cookie ważnym dla * .co.kr w zmiennej o nazwie + PHPSESSID = nielegalny , nadal możesz DOS -ować każdą aplikację PHP w Korei, używając sesji PHP ...
Dyskusja trwa przez kilka kolejnych postów i jest interesująca do przeczytania.
Jak widać, głównym problemem z $ _REQUEST jest nie tyle to, że ma dane z $ _GET i $ _POST, ale także z $ _COOKIE. Kilku innych gości na liście zasugerowało zmianę kolejności, w jakiej $ _REQUEST jest wypełniane, np. Wypełnienie go najpierw $ _COOKIE, ale może to prowadzić do wielu innych potencjalnych problemów, na przykład z obsługą sesji .
Możesz jednak całkowicie pominąć $ _COOKIES w globalnej $ _REQUEST, aby nie zostało nadpisane przez żadną z innych tablic (w rzeczywistości możesz ograniczyć to do dowolnej kombinacji jego standardowej zawartości, jak podręcznik PHP dotyczący ustawienia zmiennej_order ini Powiedz nam:
variable_order Ustawia kolejność analizowania zmiennych EGPCS (środowisko, pobieranie, przesyłanie, plik cookie i serwer). Na przykład, jeśli variable_order jest ustawione na "SP", to PHP utworzy superglobale $ _SERVER i $ _POST, ale nie utworzy $ _ENV, $ _GET i $ _COOKIE. Ustawienie na „” oznacza, że nie zostaną ustawione żadne superglobalne.
Ale z drugiej strony możesz również rozważyć całkowite rezygnację z używania $ _REQUEST, po prostu dlatego, że w PHP możesz uzyskać dostęp do środowiska, pobierania, wysyłania, pliku cookie i serwera w ich własnych globach i mieć jeden wektor ataku mniej. Nadal musisz oczyścić te dane, ale to jedna rzecz mniej, o którą musisz się martwić.
Teraz możesz się zastanawiać, dlaczego mimo wszystko $ _REQUEST istnieje i dlaczego nie jest usuwany. Zapytano o to również w PHP Internals. Cytując Rasmusa Lerdorfa o tym, dlaczego istnieje $ _REQUEST? on PHP Internals
Im więcej takich rzeczy usuwamy, tym trudniej jest ludziom szybko przejść na nowsze, szybsze i bezpieczniejsze wersje PHP. To powoduje znacznie więcej frustracji dla wszystkich niż kilka „brzydkich” starszych funkcji. Jeśli istnieje przyzwoity powód techniczny, wydajność lub bezpieczeństwo, musimy się temu dokładnie przyjrzeć. W tym przypadku powinniśmy się przyjrzeć nie temu, czy powinniśmy usunąć $ _REQUEST, ale czy powinniśmy usunąć z niego dane cookie. Wiele konfiguracji już to robi, w tym wszystkie moje, i istnieje silny uzasadniony powód ze względów bezpieczeństwa, aby nie uwzględniać plików cookie w usłudze $ _REQUEST. Większość ludzi używa zmiennej $ _REQUEST na oznaczenie GET lub POST, nie zdając sobie sprawy, że może ona również zawierać pliki cookie i jako tacy złoczyńcy mogą potencjalnie zrobić kilka sztuczek z wstrzyknięciem plików cookie i zepsuć naiwne aplikacje.
W każdym razie, mam nadzieję, że to rzuciło trochę światła.