Kiedy powinienem użyć metody GET lub POST? Jaka jest różnica między nimi?


249

Jaka jest różnica podczas używania GETlub POSTmetody? Który jest bezpieczniejszy? Jakie są (nie) zalety każdego z nich?

( podobne pytanie )


2
Get nie ma ciała, więc w praktyce oznacza to, że jesteś ograniczony do par nazwa-wartość jako struktura danych z powodu braku jakiegokolwiek formatu kodowania ciągu zapytania dla bardziej złożonej struktury. Jeśli potrzebujesz obsługiwać bardziej złożone struktury danych w swoich żądaniach (tj. Tablicę, obiekt itp.), Musisz użyć POST i być może bardziej zaawansowanych formatów (json / xml). Krótko mówiąc: nie używaj GET, chyba że naprawdę musisz (tzn. URL / zasób musi być możliwy do wykrycia).
themihai

Odpowiedzi:


263

To nie jest kwestia bezpieczeństwa. Protokół HTTP definiuje żądania typu GET jako idempotentne , podczas gdy testy POST mogą mieć skutki uboczne. W prostym języku angielskim oznacza to, że GET służy do przeglądania czegoś, bez zmiany, podczas gdy POST służy do zmiany czegoś. Na przykład strona wyszukiwania powinna używać GET, a formularz zmieniający hasło powinien używać POST.

Zauważ też, że PHP trochę myli pojęcia. Żądanie POST pobiera dane wejściowe z ciągu zapytania i za pośrednictwem treści żądania. Żądanie GET po prostu pobiera dane wejściowe z ciągu zapytania. Zatem żądanie POST jest nadzbiorem żądania GET; możesz użyć $_GETw żądaniu POST, a nawet może mieć sens posiadanie parametrów o tej samej nazwie $_POSTi $_GEToznaczających różne rzeczy.

Załóżmy na przykład, że masz formularz do edytowania artykułu. Identyfikator artykułu może znajdować się w ciągu zapytania (a więc dostępny przez $_GET['id']), ale powiedzmy, że chcesz zmienić identyfikator artykułu. Nowy identyfikator może być wtedy obecny w treści żądania ( $_POST['id']). OK, może nie jest to najlepszy przykład, ale mam nadzieję, że ilustruje różnicę między nimi.


13
Różnica między GET i POST ma zdecydowanie aspekt bezpieczeństwa. Złośliwa witryna może przykleić dowolne żądanie GET w tagu obrazu, na przykład zmuszając użytkowników do wykonania GET na innym serwerze. Jeśli ten GET jest jak inny serwer / usuń konto wraca, zdarzają się złe rzeczy.
Frank Schwieterman,

2
Miałem na myśli to, że zawartość $ _POST nie jest magicznie ukryta przed złośliwymi użytkownikami. Oczywiście wszystkie aspekty programowania dotyczą bezpieczeństwa.
troelskn

1
Ten post nie odpowiada całkowicie na pytanie, ponieważ nie wspomina o implikacjach bezpieczeństwa. Górna część jest dobra, pod warunkiem, że błąd pisowni „ból angielski” zostanie zmieniony na „zwykły angielski”. Dolna część jest zbyt trudna do naśladowania. Ogólnie rzecz biorąc, znacznie lepiej niż mój post. :-)
Akrikos

1
„Żądanie POST pobiera dane wejściowe z ciągu zapytania i poprzez treść żądania.” IMHO to jest nieprawidłowe. Aby użyć obu danych wejściowych, musisz użyć $ _REQUEST. $ _POST nie otrzymuje wpisów adresu URL.
Gunnar Bernstein

1
@Frank Schwieterman Wiem, że ten post jest stary, ale usunięcie mojego konta nie jest idempotentne i nie powinienem używać get.
frostymarvellous

77

Gdy użytkownik wprowadza informacje w formularzu i klika przycisk Prześlij, są dwa sposoby przesłania informacji z przeglądarki na serwer: w adresie URL lub w treści żądania HTTP.

Metoda GET, która została użyta w poprzednim przykładzie, dołącza pary nazwa / wartość do adresu URL. Niestety długość adresu URL jest ograniczona, więc ta metoda działa tylko wtedy, gdy jest tylko kilka parametrów. Adres URL może zostać obcięty, jeśli formularz używa dużej liczby parametrów lub jeśli parametry zawierają duże ilości danych. Ponadto parametry przekazane na adres URL są widoczne w polu adresu przeglądarki, nie jest to najlepsze miejsce do wyświetlenia hasła.

Alternatywą dla metody GET jest metoda POST. Ta metoda pakuje pary nazwa / wartość w treści żądania HTTP, co zapewnia czystszy adres URL i nie nakłada żadnych ograniczeń wielkości na dane wyjściowe formularzy. Jest to również bardziej bezpieczne.


1
Jak to jest bardziej „bezpieczne”?
Julian Reschke

4
bo trudniej to zmienić? możesz zmienić GET na pasku adresu, ale nie jest to takie łatwe z POST.
IAdapter

8
Serwer nie może ufać klientowi. Projektowanie aplikacji w oparciu o fałszywe założenia nie jest bezpieczne.
troelskn

openid również nie jest zapisywany, ponieważ można go złamać?
IAdapter

1
Uważam, że jest to najbardziej jasne wytłumaczenie - różnica w rozmieszczeniu przesyłanych danych. Dziękuję Ci.
greenoldman

37

Najlepsza odpowiedź była pierwsza.

Ty używasz:

  • Uzyskaj, gdy chcesz odzyskać dane (GET DATA).
  • POST, gdy chcesz wysłać dane (POST DATA).

2
Co to jest używany wzorzec usługi żądanie / odpowiedź, a chcesz zrobić jedno i drugie? ;) Wolę używać POST w większości przypadków, gdy potrzebuję odpowiedzi z powrotem.
Dmitrij Pawłow

8
Ogólnie to prawda. GETdoskonale nadaje się również do „wysyłania” danych, więc nie jest to bardzo dokładna odpowiedź.
Patrick Hofman

23

Istnieją dwa wspólne implikacje związane z „bezpieczeństwem” GET. Ponieważ dane pojawiają się w ciągu adresu URL, możliwe, że ktoś spoglądający przez ramię na pasek adresu / adres URL może zobaczyć coś, czego nie powinni mieć dostępu, np. Sesyjny plik cookie, który może potencjalnie zostać wykorzystany do przejęcia sesji. Pamiętaj, że każdy ma telefony z aparatem.

Druga implikacja bezpieczeństwo GETma do czynienia ze GETzmiennymi są rejestrowane na większości serwerów internetowych dziennika dostępu jako część wnioskującego URL. W zależności od sytuacji, klimatu regulacyjnego i ogólnej wrażliwości danych może to potencjalnie budzić obawy.

Niektórzy klienci / zapory ogniowe / systemy IDS mogą marszczyć brwi na GETżądanie zawierające nadmierną ilość danych i dlatego mogą dawać niewiarygodne wyniki.

POST obsługuje zaawansowane funkcje, takie jak obsługa wieloczęściowego wejścia binarnego używanego do przesyłania plików na serwery sieciowe.

POSTwymaga nagłówka o długości treści, który może zwiększyć złożoność implementacji klienta specyficznej dla aplikacji, ponieważ wielkość przekazywanych danych musi być znana z góry, aby zapobiec utworzeniu żądania klienta w trybie przyrostowym z pojedynczym przejściem. Być może drobny problem dla tych, którzy wybierają nadużycie HTTP, używając go jako transportu RPC (Remote Procedural Call).

Inni już wykonali dobrą robotę, pokrywając różnice semantyczne i część „kiedy” tego pytania.


17

Używam GET podczas pobierania informacji z adresu URL i POST podczas wysyłania informacji do adresu URL.


1
ale możesz również użyć GET, aby wysłać. Różnica polega na formacie (w adresie URL (GET) lub w żądaniu (POST)).
eric

Jeśli punkt końcowy zaakceptuje plik i zwróci wiersz z pliku (nie ma potrzeby tworzenia ani zmiany danych ani bazy danych), to czy punktem końcowym powinien być GET czy POST?
zmienna

17

Powinieneś używać POST, jeśli jest dużo danych lub rodzaj poufnych informacji (naprawdę wrażliwe rzeczy również wymagają bezpiecznego połączenia).

Użyj GET, jeśli chcesz, aby użytkownicy mogli dodawać zakładki do zakładek, ponieważ wszystkie dane są dołączone do zakładki.

Uważaj tylko na osoby, które uderzają w REFRESH metodą GET, ponieważ dane będą wysyłane ponownie za każdym razem bez ostrzeżenia użytkownika (POST czasami ostrzega użytkownika przed ponownym wysłaniem danych).


Jeśli punkt końcowy zaakceptuje plik i zwróci wiersz z pliku (nie ma potrzeby tworzenia ani zmiany danych ani bazy danych), to czy punktem końcowym powinien być GET czy POST?
zmienna

@variable POST. W tym przypadku głównie dlatego, że POST jest zbudowany do obsługi przesyłania plików, a standardowy GET nie. Będziesz musiał wysyłać plik za każdym razem, gdy strona się ładuje, więc warto po prostu użyć standardowego testu POST zamiast pliku GET +, co złamałoby oczekiwania GET, że adres URL powinien dawać mniej więcej takie same wyniki za każdym razem.
Grant

14

Ten dokument W3C wyjaśnia użycie HTTP GET i POST.

Myślę, że to wiarygodne źródło.

Podsumowanie jest (sekcja 1.3 dokumentu):

  • Użyj GET, jeśli interakcja jest bardziej jak pytanie (tj. Jest bezpieczną operacją, taką jak zapytanie, operacja odczytu lub wyszukiwanie).
  • Użyj POST, jeśli:
    • Interakcja jest bardziej jak zamówienie lub
    • Interakcja zmienia stan zasobu w sposób, który użytkownik postrzega (np. Subskrypcja usługi) lub
    • Użytkownik ponosi odpowiedzialność za wyniki interakcji.

9
Myślę, że można to podsumować następująco: POBIERZ, gdy stan serwera nie zostanie zmieniony, POST, gdy jest.
Yamcha,

10

Metody pobierania i wysyłania nie mają nic wspólnego z używaną technologią serwerową, działa tak samo w php, asp.net lub ruby. GET i POST są częścią protokołu HTTP. Jak zaznaczono, POST jest bezpieczniejszy. Formularze POST również nie są buforowane przez przeglądarkę. POST służy również do przesyłania dużych ilości danych.


8

Powód używania testu POST podczas wprowadzania zmian w danych:

  • Akcelerator internetowy, taki jak Google Web Accelerator, kliknie wszystkie linki (GET) na stronie i je buforuje. Jest to bardzo złe, jeśli linki wprowadzają zmiany do rzeczy.
  • Przeglądarka buforuje żądania GET, więc nawet jeśli użytkownik kliknie łącze, może nie wysłać żądania do serwera w celu wykonania zmiany.
  • Aby chronić swoją stronę / aplikację przed CSRF, musisz użyć POST. Aby całkowicie zabezpieczyć aplikację, musisz również wygenerować unikalny identyfikator na serwerze i wysłać go wraz z żądaniem.

Nie umieszczaj też poufnych informacji w ciągu zapytania (tylko opcja z GET), ponieważ pojawia się w pasku adresu, zakładkach i dziennikach serwera.

Mam nadzieję, że wyjaśnia to, dlaczego ludzie twierdzą, że test POST jest „bezpieczny”. Jeśli przesyłasz poufne dane, musisz użyć protokołu SSL.


8

GETi POSTsą metodami HTTP, które mogą osiągnąć podobne cele

GETjest w zasadzie tylko do pobierania (pobierania) danych, A GETnie powinien mieć treści, więc oprócz plików cookie jedynym miejscem do przekazywania informacji jest adres URL, a adresy URL mają ograniczoną długość, GETjest mniej bezpieczne w porównaniu z tym, POSTże wysyłane dane są częścią adres URL

Nigdy nie używaj GETprzy wysyłaniu haseł, karty kredytowej lub innych poufnych informacji !, Dane są widoczne dla wszystkich w adresie URL, Mogą być buforowane dane. GETjest nieszkodliwy, gdy przeładowujemy lub oddzwaniamy przycisk, będzie oznaczony książką, parametry pozostaną w historii przeglądarki, dozwolone są tylko znaki ASCII.

POSTmoże obejmować dowolne czynności, takie jak przechowywanie lub aktualizowanie danych, zamawianie produktu lub wysyłanie wiadomości e-mail. POSTmetoda ma ciało.

POSTmetoda jest zabezpieczona do przekazywania poufnych i poufnych informacji do serwera, nie będzie widoczna w parametrach zapytania w adresie URL, a parametry nie zostaną zapisane w historii przeglądarki. Nie ma ograniczeń dotyczących długości danych. Podczas ponownego ładowania przeglądarka powinna ostrzec użytkownika, że ​​dane zostaną ponownie przesłane. POSTmetody nie można dodać do zakładek


3
  1. Metoda GET służy do wysyłania mniej wrażliwych danych, natomiast metoda POST służy do wysyłania wrażliwych danych.
  2. Za pomocą metody POST możesz wysyłać duże ilości danych w porównaniu do metody GET.
  3. Dane przesyłane metodą GET są widoczne na pasku nagłówka przeglądarki, natomiast dane wysyłane metodą POST są niewidoczne.

0

Użyj metody GET, jeśli chcesz odzyskać zasoby z adresu URL. Zawsze możesz zobaczyć ostatnią stronę, jeśli naciśniesz przycisk Wstecz przeglądarki, i można ją dodać do zakładek, więc nie jest tak bezpieczna jak metoda POST.

Użyj metody POST, jeśli chcesz „przesłać” coś do adresu URL. Na przykład chcesz utworzyć konto Google i może być konieczne wypełnienie wszystkich szczegółowych informacji, a następnie kliknięcie przycisku „prześlij” (tutaj wywoływana jest metoda POST), po pomyślnym przesłaniu i próba naciśnięcia przycisku Wstecz w przeglądarce , zamiast ostatniej strony z wypełnionym formularzem pojawi się błąd lub nowy pusty formularz.


-10

GETMetoda:

  • Służy tylko do wysłania daty 256 znaków

  • Podczas korzystania z tej metody informacje można zobaczyć w przeglądarce

  • Jest to domyślna metoda stosowana przez formularze

  • To nie jest tak zabezpieczone.


POSTMetoda:

  • Służy do wysyłania nieograniczonej ilości danych.

  • Dzięki tej metodzie informacji nie można wyświetlić w przeglądarce

  • Możesz wyraźnie wspomnieć o POSTmetodzie

  • Jest bardziej zabezpieczony niż GETmetoda

  • Zapewnia bardziej zaawansowane funkcje


„Służy tylko do wysłania daty 256 znaków” - nieprawda. „Korzystając z tej metody, informacje można zobaczyć w przeglądarce” - dane wpisu są również widoczne w przeglądarkach, po prostu nie jest to takie oczywiste. „Zapewnia bardziej zaawansowane funkcje” - takie jak?
Quentin

To nie jest bardzo przydatna odpowiedź. Niepoprawne informacje, takie jak „nie jest tak zabezpieczony” i „zapewnia bardziej zaawansowane funkcje” oraz inne rzeczy wymienione przez Quentin.
Andrew Barber
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.