Zdobądź vs. POST

Zdobądź vs. POST

Http POST żądają dostarczania dodatkowych danych z klienta (przeglądarki) do serwera w ciele wiadomości. W przeciwieństwie, DOSTAWAĆ Żądania obejmują wszystkie wymagane dane w adresie URL. Formy w HTML mogą używać dowolnej metody, określając Method = "Post" Lub Method = "Get" (domyślnie) w element. Określona metoda określa, w jaki sposób dane formy są przesyłane do serwera. Po uzyskaniu metody wszystkie dane formularza są kodowane do adresu URL, dołączone do działanie URL jako parametry ciągów zapytania. Z postem dane z formularza pojawiają się w ramach wiadomości komunikatu żądania HTTP.

Wykres porównania

Uzyskaj wykres porównywania postów
DOSTAWAĆPOST
  • Obecna ocena to 4.12/5
  • 1
  • 2
  • 3
  • 4
  • 5
(1244 oceny)
  • Obecna ocena to 4.42/5
  • 1
  • 2
  • 3
  • 4
  • 5
(1364 oceny)
Historia Parametry pozostają w historii przeglądarki, ponieważ są częścią adresu URL Parametry nie są zapisywane w historii przeglądarki.
Dodane do zakładek Można dodać do zakładek. Nie można dodać zakładek.
Przycisk Wstecz/Zachowanie ponownego podziwu Pobierz żądania są ponownie wykonane, ale nie mogą być ponownie podawane na serwerze, jeśli HTML jest przechowywany w pamięci podręcznej przeglądarki. Przeglądarka zwykle ostrzega użytkownika, że ​​dane będą musiały zostać ponownie podmiotowe.
Typ kodowania (atrybut enctype) Application/X-WWW-FORM-URLENCODED Multipart/Form-Data lub aplikacja/X-WWW-FORM-URLENCODED Użyj multipart kodowania dla danych binarnych.
Parametry Może wysyłać, ale dane parametrów są ograniczone do tego, co możemy włożyć do wiersza żądania (URL). Najbezpieczniejsze w użyciu mniej niż 2k parametrów, niektóre serwery obsługują do 64k Może wysyłać parametry, w tym przesyłanie plików, na serwer.
Zhakowany Łatwiejsze do włamania się do dzieci Trudniejsze do włamania się
Ograniczenia typu danych formularza Tak, dozwolone tylko postacie ASCII. Bez ograniczeń. Dane binarne są również dozwolone.
Bezpieczeństwo Get jest mniej bezpieczny w porównaniu z postem, ponieważ wysłane dane są częścią adresu URL. Jest więc zapisywane w historii przeglądarki i dziennikach serwerów w prostym tekście. Post jest nieco bezpieczniejszy niż GET, ponieważ parametry nie są przechowywane w historii przeglądarki ani w dziennikach serwerów internetowych.
Ograniczenia dotyczące długości danych formularza Tak, ponieważ dane z formularzy znajdują się w adresie URL, a długość adresu URL jest ograniczona. Bezpieczny limit długości adresu URL to często 2048 znaków, ale różni się w zależności od przeglądarki i serwera internetowego. Bez ograniczeń
Użyteczność Pobierz metodę nie powinien być używana podczas wysyłania haseł lub innych poufnych informacji. Metoda postu stosowana podczas wysyłania haseł lub innych poufnych informacji.
Widoczność Metoda GET jest widoczna dla wszystkich (będzie wyświetlana na pasku adresu przeglądarki) i ma ograniczenia dotyczące wysyłania informacji. Zmienne metody posty nie są wyświetlane w adresie URL.
Buforowany Można buforować Nie buforowany

Różnice w składaniu formularzy

Podstawowa różnica między Method = "Get" I Method = "Post" jest to, że odpowiadają różne żądania HTTP, zgodnie z definicją w specyfikacjach HTTP. Proces przesyłania obu metod rozpoczyna się w ten sam sposób - zestaw danych formularza jest konstruowany przez przeglądarkę, a następnie kodowany w sposób określony przez Enctype atrybut. Dla Method = "Post Enctype atrybut może być Multipart/Form-Data Lub Application/X-WWW-FORM-URLENCODED, podczas gdy Method = "Get", tylko Application/X-WWW-FORM-URLENCODED jest dozwolone. Ten zestaw danych formularza jest następnie przesyłany na serwer.

W celu przesłania formularza za pomocą metody = „get” przeglądarka konstruuje adres URL, przyjmując wartość działanie atrybut, dołączanie ? Następnie dołącz do zestawu danych formularza (kodowany przy użyciu typu treści aplikacji/X-WWW-FORM-URLANCODED). Przeglądarka następnie przetwarza ten adres URL, tak jakby podążał za linkiem (lub jakby użytkownik wpisał adres URL bezpośrednio). Przeglądarka dzieli adres URL na części i rozpoznaje hosta, a następnie wysyła do tego hosta żądanie GET z resztą adresu URL jako argument. Serwer zabiera go stamtąd. Należy zauważyć, że ten proces oznacza, że ​​dane formularza są ograniczone do kodów ASCII. Należy zachować szczególną ostrożność, aby zakodować i dekodować inne typy znaków podczas przechodzenia przez je adres URL w formacie ASCII.

Zgłoszenie formularza z metodą = "post" powoduje wysłanie żądania postu, używając wartości działanie atrybut i wiadomość utworzona zgodnie z typem treści określonym przez Enctype atrybut.

Plusy i minusy

Ponieważ dane o formularzu są wysyłane jako część adresu URL, gdy DOSTAWAĆ Jest używane --

  • Dane formularza są ograniczone do kodów ASCII. Należy zachować szczególną ostrożność, aby zakodować i dekodować inne typy znaków podczas przechodzenia przez je adres URL w formacie ASCII. Z drugiej strony, dane binarne, obrazy i inne pliki mogą być przesłane za pośrednictwem Method = "Post"
  • Wszystkie dane formy wypełnione są widoczne w adresie URL. Ponadto jest również przechowywany w historii/dziennikach przeglądania użytkownika dla przeglądarki. Te problemy stanowią DOSTAWAĆ Mniej bezpieczne.
  • Jednak jedną zaletą danych formularzy wysyłanych w ramach adresu URL jest to, że można dodać adresy URL i bezpośrednio je używać i całkowicie ominąć proces wypełniania formularzy.
  • Istnieje ograniczenie, ile danych można wysłać, ponieważ długości adresów URL są ograniczone.
  • Kiddies scenariusza mogą łatwiej ujawnić luki w systemie, aby go zhakować. Na przykład Citibank został zhakowany przez zmianę numerów konta w ciągu adresu URL.[1] Oczywiście doświadczeni hakerzy lub twórcy stron internetowych mogą ujawnić takie luki, nawet jeśli jest używany post; To trochę trudniejsze. Zasadniczo serwer musi być podejrzliwy wobec wszelkich danych wysyłanych przez klienta i strzec przed niepewnym referencjami o bezpośrednich obiektach.

Różnice w przetwarzaniu po stronie serwera

Zasadniczo przetwarzanie przesłanych danych formularza zależy od tego, czy jest on wysyłany Method = "Get" Lub Method = "Post". Ponieważ dane są kodowane na różne sposoby, potrzebne są różne mechanizmy dekodowania. Zatem ogólnie rzecz biorąc, zmiana metody może wymagać zmiany skryptu, który przetwarza zgłoszenie. Na przykład podczas korzystania z interfejsu CGI skrypt odbiera dane w zmiennej środowiskowej (QueryString), gdy DOSTAWAĆ Jest używane. Ale kiedy POST jest używany, dane z formularzy są przekazywane w standardowym strumieniu wejściowym (stdin), a liczba bajtów do odczytania jest podana przez nagłówek długości zawartości.

Co się stanie, gdy get i po zmiennych konflikt?

W niektórych językach, takich jak PHP, informacje z parametrów GET i Post, oprócz dostępności osobno, są również łączone w zmienną wygody E.G., $ _Request W PHP. Jeśli istnieje konflikt I.mi., Ta sama nazwa parametrów jest używana z różnymi wartościami w GET, a po-po-konflikcie jest rozwiązywane w przypadku niektórych reguł. W przypadku PHP, precedens decyduje Zmienne_Order Dyrektywa konfiguracyjna. Domyślna kolejność to EGPC (środowisko, get, post, plik cookie, serwer). Oznacza to, że zmienna w $ _get ma pierwszeństwo ponad $ _post, co z kolei ma pierwszeństwo ponad $ _cookie.

Zalecane użycie

Get jest zalecane przy składaniu formularzy „idempotent” - tych, które nie „znacząco zmieniają stan świata”. Innymi słowy, formularze obejmujące tylko zapytania bazy danych. Inną perspektywą jest to, że kilka pytań idempotentnych będzie miało taki sam efekt jak jedno zapytanie. Jeśli w grę wchodzą aktualizacje bazy danych lub inne działania, takie jak wyzwalanie wiadomości e -mail, zaleca się użycie postu.

Z bloga programistów Dropbox:

Przeglądarka nie wie dokładnie, co robi konkretny formularz HTML, ale jeśli formularz jest przesłany za pośrednictwem HTTP, przeglądarka wie, że bezpiecznie jest automatyczne ponowne ponowne ponowne ponowne ponowne przesłanie, jeśli wystąpi błąd sieciowy. W przypadku form, które używają postu HTTP, ponowne ponowne ponowne miejsce może być bezpieczne, więc przeglądarka najpierw prosi użytkownika o potwierdzenie.

Żądanie „zdobądź” jest często dożywalne, podczas gdy nie może być żądanie „post”. W przypadku systemów zapytań może to mieć znaczny wpływ na wydajność, zwłaszcza jeśli sznurki zapytania są proste, ponieważ pamięci podręczne mogą serwować najczęstsze zapytania.

W niektórych przypadkach używanie POST jest zalecany nawet w przypadku pytań idempotentowych:

  • Jeśli dane z formularza zawierałyby znaki inne niż ASCII (takie jak postacie akcentowane), zatem Method = "Get" zasadniczo nie ma zastosowania, chociaż może działać w praktyce (głównie w przypadku znaków latynoskich ISO).
  • Jeśli zestaw danych formularza jest duży - Powiedz, setki postaci - wtedy Method = "Get" może powodować praktyczne problemy z implementacjami, które nie mogą poradzić sobie z tak długimi adresami URL.
  • Możesz chcieć uniknąć Method = "Get" Aby uczynić go mniej widocznym dla użytkowników, jak działa formularz, szczególnie w celu uczynienia „ukrytych” pól (wejście type = „ukryty”) bardziej ukryty, nie pojawiając się w adresie URL. Ale nawet jeśli używasz ukrytych pola z Method = "Post", Nadal będą pojawiać się w kodzie źródłowym HTML.

A co z HTTPS?

Zaktualizowano 15 maja 2015 r.: Specjalnie podczas korzystania z HTTPS (HTTP przez TLS/SSL), czy Post oferuje więcej bezpieczeństwa niż dostanie?

To jest interesujące pytanie. Powiedz, że dokonujesz prośby na stronę internetową:

 Pobierz https: // www.przykład.com/login.php?User = Mickey & Passwd = mini 

Zakładając, że połączenie internetowe jest monitorowane, jakie informacje o tym żądaniu będą dostępne dla Snoopera? Jeśli zamiast tego użyje się post, a dane użytkownika i passwd są zawarte w zmiennych postu, czy będą to bezpieczniejsze w przypadku połączeń HTTPS?

Odpowiedź brzmi nie. Jeśli złożycie takie żądanie GET, tylko następujące informacje będą znane atakującemu monitorującego ruch w sieci:

  1. Fakt, że nawiązałeś połączenie HTTPS
  2. Nazwa hosta - www.przykład.com
  3. Całkowita długość żądania
  4. Długość odpowiedzi

Ścieżka części URL - i.mi., Rzeczywista strona żądana, a także parametry ciągów zapytania - są chronione (szyfrowane), gdy są „nad drutem” i.mi., w tranzycie w drodze do serwera docelowego. Sytuacja jest dokładnie taka sama w przypadku żądań pocztowych.

POST Metoda nadal zachowuje jedną przewagę, nawet w przypadku HTTPS,. Serwery internetowe mają tendencję do rejestrowania całego żądanego adresu URL zwykłym tekstem w dziennikach dostępu; Zatem wysyłanie poufnych informacji na temat GET nie jest dobrym pomysłem. Ma to zastosowanie niezależnie od tego, czy stosuje się HTTP lub HTTPS.