GET verzus POST

HTTP POST požaduje dodanie ďalších údajov z klienta (prehľadávača) na server v tele správy. Na rozdiel od toho, GET žiadosti obsahujú všetky požadované údaje v adrese URL. Formuláre v HTML môžu použiť ktorúkoľvek z uvedených metód method = "POST" alebo metóda = "GET" (predvolené) v prvok. Zadaná metóda určuje, ako sa údaje formulára odosielajú na server. Ak je metódou GET, všetky údaje formulára sa zakódujú do adresy URL pripojenej k akčné URL ako parametre reťazca dopytu. Pri POST sa údaje formulára zobrazia v tele správy žiadosti HTTP.

Porovnávacia tabuľka

Porovnávacia tabuľka GET verzus POST
GETPOST
histórie Parametre zostávajú v histórii prehliadača, pretože sú súčasťou adresy URL Parametre sa neuložia do histórie prehliadača.
záložkou Môže byť označený záložkou. Nemožno uložiť medzi záložky.
Tlačidlo SPÄŤ / opakované odoslanie Žiadosti GET sa znova vykonávajú, ale nemusia sa znova odosielať na server, ak je HTML uložené v pamäti prehliadača. Prehliadač zvyčajne upozorňuje používateľa, že bude potrebné údaje znova odoslať.
Typ kódovania (atribút enctype) aplikácie / x-www-form-urlencoded multipart / form-data alebo application / x-www-form-urlencoded Použite multipartové kódovanie pre binárne dáta.
parametre ale údaje parametrov sú obmedzené na to, čo môžeme vložiť do riadku žiadosti (URL). Niektoré servery, ktoré sú najbezpečnejšie na použitie menej ako 2 kB parametrov, zvládnu až 64 kB Môže odosielať parametre vrátane nahrávania súborov na server.
Hacked Ľahšie sa hackne na skripty Ťažšie sa hacknúť
Obmedzenia typu údajov formulára Áno, povolené sú iba znaky ASCII. Žiadne obmedzenia. Binárne údaje sú tiež povolené.
zabezpečenia GET je v porovnaní s POST menej bezpečný, pretože odoslané údaje sú súčasťou adresy URL. Je teda uložená v histórii prehliadača a protokoloch servera v obyčajnom texte. POST je o niečo bezpečnejšie ako GET, pretože parametre sa neukladajú v histórii prehliadača ani v protokoloch webového servera.
Obmedzenia týkajúce sa dĺžky údajov formulára Áno, pretože údaje formulára sú v adrese URL a dĺžka adresy URL je obmedzená. Dĺžka bezpečnej adresy URL je často 2 048 znakov, ale líši sa podľa prehliadača a webového servera. Žiadne obmedzenia
Použiteľnosť Pri odosielaní hesiel alebo iných citlivých informácií by sa metóda GET nemala používať. Metóda POST použitá pri odosielaní hesiel alebo iných citlivých informácií.
viditeľnosť Metóda GET je viditeľná pre všetkých (bude sa zobrazovať v paneli s adresou prehliadača) a obmedzuje množstvo informácií, ktoré sa majú odoslať. Premenné metódy POST sa v adrese URL nezobrazujú.
medzipamäte Môže byť v pamäti Nie je v pamäti

Obsah: GET verzus POST

  • 1 Rozdiely v podávaní formulárov
    • 1.1 Klady a zápory
  • 2 Rozdiely v spracovaní na strane servera
  • 3 Odporúčané použitie
  • 4 A čo HTTPS?
  • 5 Referencie

Rozdiely v predkladaní formulárov

Základný rozdiel medzi Method = "GET" a METHOD = "POST" je to, že zodpovedajú rôzne HTTP požiadavky, ako je definované v špecifikáciách HTTP. Proces predkladania pre obe metódy začína rovnakým spôsobom - súbor údajov formulára je skonštruovaný prehliadačom a potom kódovaný spôsobom určeným enctype atribút. pre METHOD = "POST enctype atribút môže byť multipart / form-dát alebo aplikácie / x-www-form-urlencoded, zatiaľ čo pre Method = "GET", iba aplikácie / x-www-form-urlencoded je dovolené. Tento súbor dát formulára sa potom prenesie na server.

Pre odoslanie formulára s METHOD = "GET" prehliadač vytvorí URL tak, že vezme hodnotu akčné atribút, pripájajúci a ? k nemu, potom sa pripojí sada dát formulára (kódovaná pomocou typu obsahu application / x-www-form-urlencoded). Prehliadač potom spracuje túto adresu URL tak, akoby nasledoval odkaz (alebo akoby používateľ zadal adresu URL priamo). Prehliadač rozdelí adresu URL na časti a rozpozná hostiteľa, potom pošle tomuto hostiteľovi požiadavku GET so zvyškom adresy URL ako argument. Server to odtiaľ vezme. Tento proces znamená, že údaje formulára sú obmedzené na kódy ASCII. Osobitná pozornosť by sa mala venovať kódovaniu a dekódovaniu iných typov znakov pri ich prechode cez URL vo formáte ASCII.

Odoslanie formulára s METHOD = "POST" spôsobí odoslanie POST žiadosti s použitím hodnoty akčné Atribút a správa vytvorená podľa typu obsahu špecifikovaného v enctype atribút.

Klady a zápory

Keďže údaje formulára sa odosielajú ako súčasť adresy URL, keď GET sa používa --

  • Údaje formulára sú obmedzené na kódy ASCII. Osobitná pozornosť by sa mala venovať kódovaniu a dekódovaniu iných typov znakov pri ich prechode cez URL vo formáte ASCII. Na druhej strane je možné prostredníctvom binárnych údajov, obrázkov a ďalších súborov odoslať všetky údaje METHOD = "POST"
  • Všetky vyplnené údaje formulára sú viditeľné v adrese URL. Navyše je tiež uložená v histórii / protokoloch prehliadača užívateľa pre webový prehliadač. Tieto problémy spôsobujú GET menej bezpečné.
  • Jednou z výhod údajov odoslaných ako súčasť adresy URL je však to, že si môžete adresy URL uložiť ako záložku a priamo ich použiť a úplne obísť proces vypĺňania formulárov.
  • Počet dát formulára je možné odoslať, pretože dĺžka adries URL je obmedzená.
  • Deti zo skriptov môžu ľahšie odhaliť zraniteľné miesta v systéme, ktoré ich napadnú. Napríklad Citibank bola napadnutá zmenou čísiel účtov v reťazci URL.[1] Skúsení hackeri alebo weboví vývojári samozrejme môžu takéto zraniteľné miesta odhaliť, aj keď sa používajú POST; je to len trochu ťažšie. Vo všeobecnosti musí byť server podozrivý na akékoľvek dáta odoslané klientom a chrániť pred nezabezpečenými priamymi referenciami na objekty.

Rozdiely v spracovaní na strane servera

Spracovanie údajov odoslaného formulára v zásade závisí od toho, či sa odošlú Method = "GET" alebo METHOD = "POST". Pretože dáta sú kódované rôznymi spôsobmi, sú potrebné rôzne dekódovacie mechanizmy. Vo všeobecnosti teda zmena METÓDY môže vyžadovať zmenu v skripte, ktorý spracováva predloženie. Napríklad, keď používate rozhranie CGI, skript prijíma dáta v premennej prostredia (QUERYSTRING), keď GET sa používa. Ale keď POST sa použije, údaje formulára sa odovzdajú v štandardnom vstupnom toku (stdin) a počet bajtov, ktoré sa majú prečítať, je uvedený v záhlaví Content-length.

Odporúčané použitie

GET sa odporúča pri predkladaní „idempotentných“ formulárov - tých, ktoré „významne nemenia stav sveta“. Inými slovami, formuláre, ktoré zahŕňajú iba databázové dotazy. Ďalšou perspektívou je, že niekoľko idempotentných dopytov bude mať rovnaký účinok ako jeden dotaz. Ak ide o aktualizácie databázy alebo iné akcie, napríklad o spustenie e-mailov, odporúča sa použitie testu POST.

Z blogu vývojára Dropboxu:

prehliadač presne nevie, čo konkrétny formulár HTML robí, ale ak je formulár odoslaný prostredníctvom protokolu HTTP GET, prehliadač vie, že je bezpečné automaticky opakovať odoslanie v prípade chyby siete. V prípade formulárov, ktoré používajú HTTP POST, nemusí byť bezpečné opakovať pokus, takže prehliadač najprv požiada používateľa o potvrdenie.

Požiadavka „GET“ je často na vyrovnávacej pamäti, zatiaľ čo požiadavka „POST“ môže byť sotva splnená. Pre systémy dotazov to môže mať značný vplyv na účinnosť, najmä ak sú reťazce dotazov jednoduché, pretože cache môžu slúžiť najčastejšie dotazy.

V niektorých prípadoch použitie POST sa odporúča aj pre idempotentné dotazy:

  • Ak by údaje formulára obsahovali znaky iné ako ASCII (napríklad znaky s diakritikou) Method = "GET" je v zásade neuplatniteľný, hoci v praxi to môže fungovať (hlavne pre znaky ISO Latin 1).
  • Ak je súbor údajov formulára veľký - povedzme, stovky znakov - potom Method = "GET" môže spôsobiť praktické problémy s implementáciami, ktoré nedokážu spracovať tieto dlhé adresy URL.
  • Možno by ste sa chceli vyhnúť Method = "GET" aby boli pre používateľov menej viditeľné, ako formulár funguje, najmä preto, aby sa skryté polia (INPUT TYPE = "HIDDEN") skryli tým, že sa nezobrazia v adrese URL. Ale aj keď používate skryté polia s METHOD = "POST", stále sa zobrazia v zdrojovom kóde HTML.

A čo HTTPS?

Aktualizované 15. mája 2015: Konkrétne pri použití protokolu HTTPS (HTTP cez TLS / SSL) ponúka POST vyššiu bezpečnosť ako GET?

Toto je zaujímavá otázka. Povedzme, že ste na webovú stránku odoslali žiadosť:

 ZÍSKAJTE https://www.example.com/login.php?user=mickey&passwd=mini 

Aké informácie o tejto žiadosti budú k dispozícii snooperovi za predpokladu, že sa monitoruje vaše internetové pripojenie? Ak sa namiesto toho použije POST a údaje používateľa a passwd sú zahrnuté do premenných POST, bude to v prípade pripojenia HTTPS bezpečnejšie.?

Odpoveď znie nie. Ak podáte takúto požiadavku GET, útočník bude sledovať iba nasledujúce informácie, ktoré sledujú váš webový prenos:

  1. Skutočnosť, že ste vytvorili pripojenie HTTPS
  2. Názov hostiteľa - www.example.com
  3. Celková dĺžka žiadosti
  4. Dĺžka odpovede

Časť cesty URL - t. J. Skutočná požadovaná stránka, ako aj parametre reťazca dotazov - sú chránené (šifrované), zatiaľ čo počas ich cesty na cieľový server sú prenášané cez kábel. Situácia je rovnaká pre žiadosti o POST.

Webové servery majú samozrejme tendenciu logovať celú URL vo formáte obyčajného textu do svojich prístupových protokolov; zasielanie citlivých informácií cez GET preto nie je dobrý nápad. To platí bez ohľadu na to, či sa používa HTTP alebo HTTPS.

Referencie

  • wikipedia: POST (HTTP)
  • Metódy požiadavky HTTP
  • Príspevok HTTP - W3.org
  • Získať HTTP - W3.org
  • Skryje protokol HTTPS prístupové adresy URL? - Stack Exchange