GET vs POST

HTTP POST prašo pateikti papildomus duomenis iš kliento (naršyklės) į serverį žinutės tekste. Priešingai, GAUTI užklausose URL yra visi reikalingi duomenys. HTML formos gali naudoti bet kurį metodą, nurodydamos metodas = „POST“ arba metodas = „GET“ (numatytasis) elementas. Nurodytas metodas nustato, kaip formos duomenys pateikiami serveriui. Kai metodas yra GET, visi formos duomenys yra užkoduojami URL, pridedamame prie veiksmas URL kaip užklausos eilutės parametrai. Naudojant POST, formos duomenys pasirodo HTTP užklausos pranešimo tekste.

Palyginimo diagrama

GET ir POST palyginimo lentelė
GAUTIPOST
Istorija Parametrai išlieka naršyklės istorijoje, nes jie yra URL dalis Parametrai neišsaugomi naršyklės istorijoje.
Pažymėta Galima žymėti. Negalima pažymėti.
Mygtukas „BACK“ / pakartoti elgesį GET užklausos yra pakartotinai vykdomos, tačiau negali būti pakartotinai pateiktos serveriui, jei HTML yra saugomas naršyklės talpykloje. Paprastai naršyklė įspėja vartotoją, kad duomenis reikės pateikti iš naujo.
Kodavimo tipas (enctype atributas) paraiška / x-www-forma-urlencoded multipart / form-data arba application / x-www-form-urlencoded Dvejetainiams duomenims naudokite kelių dalių kodavimą.
Parametrai galime siųsti, bet parametrų duomenys apsiriboja tuo, ką galime įtraukti į užklausos eilutę (URL). Saugiausia naudoti mažiau nei 2K parametrus, kai kurie serveriai tvarko iki 64K Gali nusiųsti parametrus, įskaitant failų įkėlimą, į serverį.
Nulaužė Lengviau nulaužti scenarijaus vaikams Sunkiau nulaužti
Formos duomenų tipo apribojimai Taip, leidžiami tik ASCII simboliai. Jokių apribojimų. Taip pat leidžiami dvejetainiai duomenys.
Saugumas GET yra mažiau saugus, palyginti su POST, nes siunčiami duomenys yra URL dalis. Taigi, tai išsaugoma naršyklės istorijoje ir serverio žurnaluose paprastu tekstu. POST yra šiek tiek saugesnis nei GET, nes parametrai nėra saugomi naršyklės istorijoje ar žiniatinklio serverio žurnaluose.
Formos duomenų ilgio apribojimai Taip, nes formos duomenys yra URL ir URL ilgis yra ribotas. Saugus URL ilgio apribojimas dažnai yra 2048 simboliai, tačiau skiriasi priklausomai nuo naršyklės ir interneto serverio. Jokių apribojimų
Naudojamumas GET metodas neturėtų būti naudojamas siunčiant slaptažodžius ar kitą neskelbtiną informaciją. POST metodas, naudojamas siunčiant slaptažodžius ar kitą neskelbtiną informaciją.
Matomumas GET metodas yra matomas visiems (jis bus rodomas naršyklės adreso juostoje) ir turi ribotas siunčiamos informacijos apimtis.. POST metodo kintamieji URL nerodomi.
Talpykloje Galima talpykloje Ne talpykloje

Turinys: GET vs POST

  • 1 Formos pateikimo skirtumai
    • 1.1 Privalumai ir trūkumai
  • 2 Serverio apdorojimo skirtumai
  • 3 Rekomenduojamas naudojimas
  • 4 Ką apie HTTPS?
  • 5 literatūros sąrašas

Formos pateikimo skirtumai

Esminis skirtumas tarp METODAS = „GET“ ir METODAS = „POST“ yra tai, kad jie atitinka skirtingos HTTP užklausos, kaip apibrėžta HTTP specifikacijose. Abiejų metodų pateikimo procesas prasideda tuo pačiu būdu - naršyklėje sukuriamas formos duomenų rinkinys, o tada užkoduojamas nurodytu būdu. enctype atributas. Dėl METODAS = „PASIŪLYTI enctype atributas gali būti daugiadalyviai / formos duomenys arba paraiška / x-www-forma-urlencoded, kadangi už METODAS = „GET“, tik paraiška / x-www-forma-urlencoded leidziama. Tada šios formos duomenų rinkinys perduodamas į serverį.

Pateikiant formą naudojant METHOD = "GET", naršyklė sukuria URL, paėmusi veiksmas atributas, pridedant a ? prie jo, tada pridedami formos duomenų rinkiniai (užkoduoti naudojant „application / x-www-form-urlencoded“ turinio tipą). Tada naršyklė apdoroja šį URL taip, tarsi sektų nuorodą (arba taip, lyg vartotojas būtų įvedęs URL tiesiogiai). Naršyklė padalija URL į dalis ir atpažįsta pagrindinį kompiuterį, tada siunčia tam kompiuteriui GET užklausą su likusiu URL kaip argumentą. Serveris paima jį iš ten. Atminkite, kad šis procesas reiškia, kad formos duomenys yra ribojami ASCII kodais. Ypatingai atsargiai reikia koduoti ir iššifruoti kitų tipų simbolius, perduodant juos per URL ASCII formatu.

Pateikus formą su METHOD = "POST", POST užklausa turi būti išsiųsta naudojant veiksmas atributas ir pranešimas, sukurtas pagal enctype atributas.

Už ir prieš

Kadangi formos duomenys siunčiami kaip URL dalis, kai GAUTI yra naudojamas --

  • Formos duomenys yra ribojami ASCII kodais. Ypatingai atsargiai reikia koduoti ir iššifruoti kitų tipų simbolius, perduodant juos per URL ASCII formatu. Kita vertus, dvejetainius duomenis, vaizdus ir kitus failus galima pateikti per METODAS = „POST“
  • Visi užpildyti formos duomenys yra matomi URL. Be to, ji taip pat saugoma vartotojo naršymo žiniatinklyje istorijoje / žurnaluose. Dėl šių klausimų kyla GAUTI mažiau saugus.
  • Tačiau vienas formos duomenų, siunčiamų kaip URL dalis, pranašumas yra tas, kad galima žymėti URL adresus ir tiesiogiai juos naudoti bei visiškai apeiti formos užpildymo procesą..
  • Formos duomenys gali būti siunčiami ribotai, nes URL ilgiai yra riboti.
  • Scenarijaus vaikai gali lengviau atskleisti sistemos spragas, kad ją nulaužtų. Pavyzdžiui, „Citibank“ buvo nulaužtas pakeitus sąskaitos numerius URL eilutėje.[1] Žinoma, patyrę įsilaužėliai ar interneto svetainių kūrėjai gali atskleisti tokius pažeidžiamumus, net jei naudojamas POST; tai tik truputį sunkiau. Apskritai serveris turi įtarinėti bet kokius kliento siunčiamus duomenis ir saugotis nesaugių tiesioginių objektų nuorodų.

Serverio apdorojimo skirtumai

Iš esmės pateiktos formos duomenų tvarkymas priklauso nuo to, ar jie siunčiami su METODAS = „GET“ arba METODAS = „POST“. Kadangi duomenys yra užkoduojami skirtingais būdais, reikalingi skirtingi dekodavimo mechanizmai. Taigi paprastai keičiant METODĄ gali reikėti pakeisti scenarijų, kuris apdoroja pateikimą. Pavyzdžiui, naudojant CGI sąsają, scenarijus gauna duomenis iš aplinkos kintamojo (QUERYSTRING), kai GAUTI yra naudojamas. Bet kai POST yra naudojamas, formos duomenys perduodami standartiniame įvesties sraute (stdin) ir skaitomų baitų skaičių nurodo antraštė „Turinio ilgis“.

Rekomenduojamas naudojimas

GET rekomenduojama pateikti pateikiant „idempotentines“ formas - tas, kurios „nekeičia reikšmingo pasaulio būvio“. Kitaip tariant, formos, susijusios tik su duomenų bazių užklausomis. Kita perspektyva yra ta, kad kelios idempotentinės užklausos turės tokį patį poveikį kaip ir viena užklausa. Jei reikia atnaujinti duomenų bazę ar atlikti kitus veiksmus, pvz., Suaktyvinti el. Laiškus, rekomenduojama naudoti POST.

Iš „Dropbox“ kūrėjų tinklaraščio:

naršyklė tiksliai nežino, ką daro tam tikra HTML forma, tačiau jei forma pateikiama naudojant HTTP GET, naršyklė žino, kad saugiai galima automatiškai pakartoti pateikimą, jei įvyksta tinklo klaida. Formas, kurios naudoja HTTP POST, gali būti nesaugu pakartoti, todėl naršyklė pirmiausia paprašo vartotojo patvirtinimo.

„GET“ užklausa dažnai yra talpykloje, tuo tarpu „POST“ užklausa vargu ar gali būti. Užklausų sistemoms tai gali turėti nemažą efektyvumą, ypač jei užklausų eilutės yra paprastos, nes talpyklos gali būti naudojamos dažniausiai pasitaikančioms užklausoms.

Tam tikrais atvejais naudojant POST rekomenduojama net idempotentinėms užklausoms:

  • Jei formos duomenyse būtų ne ASCII simbolių (pvz., su diakritiniais ženklais) METODAS = „GET“ iš principo netaikomas, nors praktiškai gali veikti (daugiausia naudojant ISO Lotynų 1 simbolius).
  • Jei formos duomenų rinkinys yra didelis - tarkim, šimtai simbolių - tada METODAS = „GET“ gali sukelti praktinių problemų diegiant, kurios negali valdyti tų ilgų URL.
  • Galbūt norėtumėte to išvengti METODAS = „GET“ kad vartotojams būtų mažiau matoma, kaip veikia forma, ypač tam, kad „paslėpti“ laukai (INPUT TYPE = „HIDDEN“) būtų labiau paslėpti, nes nerodomi URL. Bet net jei jūs naudojate paslėptus laukus su METODAS = „POST“, jie vis tiek bus rodomi HTML šaltinio kode.

O HTTPS?

Atnaujinta 2015 m. Gegužės 15 d.: Ar konkrečiai naudojant HTTPS (HTTP per TLS / SSL), POST teikia daugiau saugumo nei GET?

Tai įdomus klausimas. Tarkime, kad pateikiate GET užklausą į tinklalapį:

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

Darant prielaidą, kad jūsų interneto ryšys yra stebimas, kokią informaciją apie šią užklausą gaus snooperis? Jei vietoj to bus naudojamas POST, o vartotojo ir slaptažodžių duomenys bus įtraukti į POST kintamuosius, ar tai bus saugesnė naudojant HTTPS ryšius?

Atsakymas yra ne. Jei pateiksite tokią GET užklausą, užpuolikui, stebinčiam jūsų interneto srautą, bus žinoma tik ši informacija:

  1. Tai, kad užmezgėte HTTPS ryšį
  2. Pagrindinio kompiuterio vardas - www.example.com
  3. Bendra užklausos trukmė
  4. Atsakymo trukmė

Kelio URL dalis, t. Y. Tikrasis prašomas puslapis, taip pat užklausos eilutės parametrai, yra saugomi (šifruojami), kol jie yra „už laido“, t. Y. Keliaujant pakeliui į paskirties serverį. Panašiai yra ir POST užklausų atveju.

Be abejo, žiniatinklio serveriai prieigos žurnaluose paprastai registruoja visą URL paprastu tekstu; todėl neskelbtinos informacijos siuntimas naudojant GET nėra gera idėja. Tai taikoma neatsižvelgiant į tai, ar naudojamas HTTP, ar HTTPS.

Nuorodos

  • Vikipedija: POST (HTTP)
  • HTTP užklausos metodai
  • HTTP pranešimas - W3.org
  • HTTP gavimas - W3.org
  • Ar HTTPS slepia naudojamus URL? - Stack Exchange