W całym Internecie widzę następujące porady:
GET nigdy nie powinien zmieniać danych na serwerze - użyj do tego żądania POST
Jaka jest podstawa tego pomysłu?
Jeśli utworzę usługę php, która wstawi dane do bazy danych i przekażę jej parametry w ciągu zapytania GET, dlaczego tak się dzieje? (Używam przygotowanych instrukcji, aby zająć się SQL Injection). Czy żądanie POST jest w jakiś sposób bardziej bezpieczne?
Czy może ma to jakiś historyczny powód? Jeśli tak, to jak ważna jest dzisiaj ta rada?
http
http-request
Devdatta Tengshe
źródło
źródło
Odpowiedzi:
To nie jest rada.
A
GET
jest zdefiniowane w ten sposób w protokole HTTP . Ma być idempotentny i bezpieczny .Jeśli chodzi o to, dlaczego - a
GET
można buforować, a w przeglądarce odświeżono. Raz po raz po raz.Oznacza to, że jeśli zrobisz to samo
GET
jeszcze raz, będzie wstawić do bazy danych ponownie .Zastanów się, co to może znaczyć, jeśli
GET
staje się linkiem i jest indeksowane przez wyszukiwarkę. Baza danych będzie pełna zduplikowanych danych.Sugeruję również czytanie identyfikatorów URI, adresowalności oraz stosowanie HTTP GET i POST .
Występuje również problem z pobieraniem linków w niektórych przeglądarkach - będą one wywoływać pobieranie linków, nawet jeśli nie zostało to zaznaczone przez autora strony.
Jeśli, powiedzmy, twoje wylogowanie jest za „GET”, linkowanym z każdej strony w Twojej witrynie, ludzie mogą się wylogować właśnie z powodu tego zachowania.
źródło
GET
nigdy nie będzie to destrukcyjne działanie (słusznie, skoro jest to określone w ten sposób). Jeśli teraz zepsujesz aplikację, psując jej specyfikację, zachowasz obie części aplikacji.GET
. Ta rada jest po prostu błędna. Bezpieczny oznacza, że użytkownik nie może być pociągnięty do odpowiedzialności za skutki uboczne, nie że nie może być żadnych skutków ubocznych. W przeciwnym razie nie możesz mieć plików dziennika dla swojego serwera, co byłoby absurdalne! Jest to dość jasno określone w sekcji 9.1.1 RFC2616.GET
nie powinien zmieniać zasobu wymaganego przezGET
, ale to nie znaczy, że „nic na serwerze nie powinno się zmienić”. Oczywiście rzeczy takie jak dzienniki, liczniki i inny stan serwera mogą ulec zmianie podczas każdego żądania.Każdy czasownik HTTP ma swoją własną odpowiedzialność. Na przykład
GET
zgodnie z definicją RFCPOST
z drugiej strony oznacza wstawkę lub bardziej formalniePowody, dla których warto to zachować:
GET
aby działać jako środek wyszukiwania informacji i eksploracji danychGET
są w istocie odczytem , podczas gdy wPOST
rzeczywistości stanowią zapisGET
ten sam adres URL musi zwrócić te same wyniki wszystkim użytkownikom, w przeciwnym razie nie będziesz mieć zaufania do zwracanego wynikuDla kompletności i tylko w celu wymuszenia prawidłowego użycia (źródło) :
GET
parametry są przekazywane jako część adresu URL, który domyślnie ma małą i ograniczoną długość 256 znaków, a niektóre serwery obsługują ponad 4000 znaków. Jeśli chcesz wstawić długi rekord, nie ma uzasadnionego sposobu na przekazanie tych danych̶G̶E̶T̶
̶ są przesyłane jako zwykły tekst. Adres URL jest zaszyfrowany za pomocą TLS, więc TLS jest w porządku.GET
jest niepraktyczneGET
jest ponownie wykonywane, jeśli użytkownik naciśnie przycisk Wstecz w przeglądarce?
znakiem wewnątrzźródło
EDYCJA: Wcześniej powiedziałem, że POST pomaga chronić cię przed CSRF, ale to źle. Nie przemyślałem tego poprawnie. Musisz wymagać unikalnego ukrytego tokena o zasięgu sesji we wszystkich swoich żądaniach zmiany danych w celu ochrony przed CSRF.
Na początku Internetu istniały akceleratory przeglądarki. Programy te zaczną klikać łącza na stronie w celu buforowania zawartości. Google Web Accelerator był jednym z tych programów. Może to spowodować spustoszenie w aplikacji, która wprowadza zmiany po kliknięciu łącza. Zakładam, że nadal są ludzie używający oprogramowania przyspieszającego.
Serwery proxy i przeglądarki będą buforować żądania GET, więc gdy użytkownik ponownie wejdzie na stronę, może nie wysłać żądania do aplikacji, więc użytkownik myśli, że podjął działanie, ale tak naprawdę nie zrobił.
źródło
Najprostsza odpowiedź brzmi: „bo to nie to
GET
znaczy”.Przekazywanie
GET
danych do aktualizacji jest jak pisanie listu miłosnego i wysyłanie go w kopercie z napisem „OFERTA SPECJALNA - DZIAŁAJ TERAZ!” W obu przypadkach nie powinieneś być zaskoczony, że odbiorca i / lub pośrednicy źle obchodzą się z Twoją wiadomością .źródło
Do operacji CRUD w aplikacji zorientowanej na bazę danych użyj następującego schematu:
Użyj HTTP GET do operacji odczytu (SQL SELECT)
Użyj HTTP PUT do operacji aktualizacji (SQL UPDATE)
Użyj HTTP POST do tworzenia operacji (SQL INSERT)
Użyj HTTP DELETE dla operacji usuwania (SQL DELETE)
źródło
Ta rada i wszystkie odpowiedzi tutaj są błędne. Oczywiście jestem zbyt dramatyczny, inne odpowiedzi są doskonałe, ale uważam, że dokładna rada powinna być udzielona w następujący sposób:
Stwierdzenie, że „nigdy” nie jest zbyt ekstremalne, i chociaż inne odpowiedzi tutaj dokładnie wyjaśniają, dlaczego powinieneś „rzadko” to robić, istnieje kilka scenariuszy, w których zmiana danych za pomocą GET jest całkowicie uzasadniona. Przykładem jest jednorazowy link weryfikacyjny e-mail. Zazwyczaj łącza te zawierają identyfikator GUID, który po uzyskaniu dostępu będzie musiał zmienić dane. Jeśli poprawnie zaimplementowane kolejne identyczne żądania GET zostaną zignorowane.
Jest to oczywiście przypadek skrajny, ale z pewnością warty odnotowania.
źródło