Żądanie GET jest nieznacznie mniej bezpieczne niż żądanie POST. Żadne z nich samo w sobie nie zapewnia prawdziwego „bezpieczeństwa”; użycie żądań POST nie zwiększy w magiczny sposób twojej witryny przed złośliwymi atakami. Jednak użycie żądań GET może sprawić, że bezpieczna aplikacja nie będzie bezpieczna.
Mantra, że „nie wolno używać żądań GET do wprowadzania zmian”, jest nadal bardzo aktualna, ale ma to niewiele wspólnego ze złośliwym zachowaniem. Formularze logowania są najbardziej wrażliwe na wysyłanie przy użyciu niewłaściwego typu żądania.
Szukaj pająków i akceleratorów internetowych
To jest prawdziwy powód, dla którego powinieneś używać żądań POST do zmiany danych. Pająki wyszukiwania będą podążać za każdym linkiem w Twojej witrynie, ale nie będą przesyłać losowych formularzy, które znajdą.
Akceleratory internetowe są gorsze niż pająki wyszukiwania, ponieważ działają na komputerze klienta i „klikają” wszystkie linki w kontekście zalogowanego użytkownika . Dlatego aplikacja, która korzysta z żądania GET do usuwania rzeczy, nawet jeśli wymaga administratora, chętnie wykona polecenia (nie złośliwego!) Akceleratora internetowego i usunie wszystko, co zobaczy .
Zmieszany atak zastępcy
Mylić atak zastępca (gdzie zastępca jest przeglądarka) jest możliwe, niezależnie od tego, czy używasz GET lub żądania POST .
Na stronach kontrolowanych przez atakujących GET i POST są równie łatwe do przesłania bez interakcji użytkownika .
Jedynym scenariuszem, w którym POST jest nieco mniej podatny, jest to, że wiele stron internetowych, które nie są pod kontrolą atakującego (powiedzmy, forum osób trzecich), pozwala na umieszczanie dowolnych obrazów (pozwalając atakującemu na wstrzyknięcie dowolnego żądania GET), ale zapobiega wszystkim sposoby wstrzykiwania arbitralnego żądania POST, automatycznego lub ręcznego.
Można argumentować, że akceleratory sieciowe są przykładem pomylonego ataku zastępcy, ale to tylko kwestia definicji. W każdym razie złośliwy atakujący nie ma nad tym kontroli, więc nie jest to atak , nawet jeśli zastępca jest zdezorientowany.
Dzienniki proxy
Serwery proxy prawdopodobnie będą rejestrować GET-y w całości, bez usuwania ciągu zapytania. Parametry żądania POST nie są zwykle rejestrowane. W obu przypadkach jest mało prawdopodobne, aby pliki cookie były rejestrowane.(przykład)
To bardzo słaby argument na korzyść POST. Po pierwsze, niezaszyfrowany ruch może być rejestrowany w całości; złośliwy serwer proxy ma już wszystko, czego potrzebuje. Po drugie, parametry żądania mają ograniczone zastosowanie dla osoby atakującej: tak naprawdę potrzebują plików cookie, więc jeśli jedyne, co mają, to dzienniki proxy, prawdopodobnie nie będą w stanie zaatakować adresu URL GET lub POST.
Istnieje jeden wyjątek dla próśb o zalogowanie: zawierają one zwykle hasło użytkownika. Zapisanie tego w dzienniku proxy otwiera wektor ataku, którego nie ma w przypadku testu POST. Jednak logowanie przez zwykły HTTP i tak jest z natury niebezpieczne.
Pamięć podręczna proxy
Buforowe proxy mogą zachować odpowiedzi GET, ale nie odpowiedzi POST. Powiedziawszy to, odpowiedzi GET mogą być niemożliwe do buforowania przy mniejszym wysiłku niż konwersja adresu URL na moduł obsługi POST.
„Referer” HTTP
Jeśli użytkownik miałby przejść do strony internetowej strony trzeciej ze strony wyświetlanej w odpowiedzi na żądanie GET, ta strona strony trzeciej zobaczy wszystkie parametry żądania GET.
Należy do kategorii „ujawnia parametry żądania stronie trzeciej”, której dotkliwość zależy od zawartości tych parametrów. Żądania POST są naturalnie odporne na to, jednak aby wykorzystać żądanie GET, haker musiałby wstawić link do swojej strony internetowej w odpowiedzi serwera.
Historia przeglądarki
Jest to bardzo podobne do argumentu „dzienniki proxy”: żądania GET są przechowywane w historii przeglądarki wraz z ich parametrami. Atakujący może je łatwo uzyskać, jeśli ma fizyczny dostęp do komputera.
Odświeżanie przeglądarki
Przeglądarka ponowi żądanie GET, gdy tylko użytkownik kliknie „odśwież”. Może to zrobić podczas przywracania kart po wyłączeniu. Wszelkie działania (powiedzmy płatność) zostaną więc powtórzone bez ostrzeżenia.
Przeglądarka nie powtórzy żądania POST bez ostrzeżenia.
Jest to dobry powód, aby używać tylko żądań POST do zmiany danych, ale nie ma to nic wspólnego ze złośliwym zachowaniem, a tym samym bezpieczeństwem.
Więc co powinienem zrobić?
- Używaj tylko żądań POST do zmiany danych, głównie ze względów niezwiązanych z bezpieczeństwem.
- Używaj tylko żądań POST dla formularzy logowania; inaczej wprowadzi wektory ataku.
- Jeśli Twoja witryna wykonuje wrażliwe operacje, naprawdę potrzebujesz kogoś, kto wie, co robi, ponieważ nie można tego ująć w jednej odpowiedzi. Musisz użyć HTTPS, HSTS, CSP, ograniczyć wstrzykiwanie SQL, wstrzyknięcie skryptu (XSS) , CSRF i wiele innych rzeczy, które mogą być specyficzne dla Twojej platformy (takich jak luka w masowym przypisywaniu w różnych środowiskach: ASP.NET MVC , Ruby on Rails itp.). Nie ma jednej rzeczy, która odróżnia „bezpieczny” (niemożliwy do wykorzystania) od „niezabezpieczony”.
W przypadku HTTPS dane POST są kodowane, ale czy adresy URL mogą być wąchane przez firmę zewnętrzną?
Nie, nie można ich obwąchać. Ale adresy URL będą przechowywane w historii przeglądarki.
Czy uczciwie byłoby powiedzieć, że najlepszą praktyką jest unikanie ewentualnego umieszczania poufnych danych w POST lub GET oraz używanie kodu po stronie serwera do obsługi poufnych informacji zamiast tego?
Zależy od tego, jak wrażliwy jest, a dokładniej, w jaki sposób. Oczywiście klient to zobaczy. Każdy, kto ma fizyczny dostęp do komputera klienta, zobaczy to. Klient może go sfałszować, wysyłając go z powrotem do Ciebie. Jeśli mają one znaczenie, to tak, zachowaj poufne dane na serwerze i nie pozwól, aby odszedł.