FÅ vs. POST

HTTP STOLPE anmodninger levere yderligere data fra klienten (browseren) til serveren i meddelelsesorganet. I modsætning, anmodninger inkluderer alle påkrævede data i URL'en. Formularer i HTML kan bruge begge metoder ved at specificere Fremgangsmåde = "POST" eller Fremgangsmåde = "GET" (standard) i element. Den specificerede metode bestemmer, hvordan formdata indsendes til serveren. Når metoden er GET, kodes alle formdata i URL'en, vedhæftet til handling URL som forespørgselsstrengsparametre. Med POST vises formdata inden for HTTP-anmodningens meddelelsesdel.

Sammenligningstabel

GET versus POST sammenligning diagram
STOLPE
Historie Parametre forbliver i browserhistorikken, fordi de er en del af URL-adressen Parametre gemmes ikke i browserhistorikken.
Bægmærke Kan bogmærkes. Kan ikke bogmærkes.
BACK-knap / indsend opførsel igen GET-anmodninger udføres igen, men sendes muligvis ikke igen til serveren, hvis HTML'en er gemt i browsercachen. Browseren advarer normalt brugeren om, at data skal indsendes igen.
Kodningstype (enctype-attribut) application / x- www-formen-urlencoded multipart / form-data eller applikation / x-www-form-urlencoded Brug multipart-kodning til binære data.
Parametre kan sende, men parameterdataene er begrænset til, hvad vi kan indsætte i anmodningslinjen (URL). Safest at bruge mindre end 2K parametre, nogle servere håndterer op til 64K Kan sende parametre, herunder uploade filer, til serveren.
hacket Nemmere at hacke til script-kiddies Sværere at hacke
Begrænsninger i formdatatype Ja, kun ASCII-tegn tilladt. Ingen begrænsninger. Binære data er også tilladt.
Sikkerhed GET er mindre sikker sammenlignet med POST, fordi sendte data er en del af URL-adressen. Så det gemmes i browserhistorik og serverlogfiler i ren tekst. POST er lidt sikrere end GET, fordi parametrene ikke gemmes i browserhistorikken eller i webserverlogfiler.
Begrænsninger i længden af ​​formdatadata Ja, da formdata findes i URL'en og URL-længden er begrænset. En sikker URL-længdegrænse er ofte 2048 tegn, men varierer fra browser og webserver. Ingen begrænsninger
Anvendelighed GET-metoden bør ikke bruges, når der sendes adgangskoder eller anden følsom information. POST-metode, der bruges ved afsendelse af adgangskoder eller anden følsom information.
Sigtbarhed GET-metoden er synlig for alle (den vises i browserens adresselinje) og har grænser for mængden af ​​information, der skal sendes. POST-metodevariabler vises ikke i URL-adressen.
Cached Kan cacher Ikke cache

Indhold: GET vs POST

  • 1 Forskelle i formindgivelse
    • 1.1 Fordele og ulemper
  • 2 Forskelle i server-side-behandling
  • 3 Anbefalet brug
  • 4 Hvad med HTTPS?
  • 5 Referencer

Forskelle i formindgivelse

Den grundlæggende forskel mellem METODE = "GET" og METODE = "POST" er, at de svarer til forskellige HTTP-anmodninger, som defineret i HTTP-specifikationerne. Indsendelsesprocessen for begge metoder begynder på samme måde - et formdatasæt konstrueres af browseren og kodes derefter på en måde, der er specificeret af enctype attribut. Til METODE = "POST det enctype attribut kan være multipart / formular-data eller application / x- www-formen-urlencoded, der henviser til, at for METODE = "GET", kun application / x- www-formen-urlencoded er tilladt. Dette formdatasæt transmitteres derefter til serveren.

Til formularindgivelse med METHOD = "GET" konstruerer browseren en URL ved at tage værdien af handling attribut, tilføjelse a ? til det, derefter tilføje formdatasættet (kodet ved hjælp af applikationen / x-www-form-urlenkodet indholdstype). Browseren behandler derefter denne URL som om at følge et link (eller som om brugeren havde indtastet URL'en direkte). Browseren opdeler URL'en i dele og genkender en vært, sender den derefter en GET-anmodning til den vært med resten af ​​URL'en som argument. Serveren tager den derfra. Bemærk, at denne proces betyder, at formdataene er begrænset til ASCII-koder. Der skal udvises særlig omhu for at kode og afkode andre typer tegn, når de sendes gennem URL'en i ASCII-format.

Indsendelse af en formular med METHOD = "POST" får en POST-anmodning til at blive sendt ved hjælp af værdien af handling attribut og en meddelelse oprettet i henhold til den indholdstype, der er specificeret af enctype attribut.

Fordele og ulemper

Da formdata sendes som en del af URL'en hvornår anvendes --

  • Formdata er begrænset til ASCII-koder. Der skal udvises særlig omhu for at kode og afkode andre typer tegn, når de sendes gennem URL'en i ASCII-format. På den anden side kan binære data, billeder og andre filer alle indsendes gennem METODE = "POST"
  • Alle udfyldte formdata er synlige i URL-adressen. Derudover gemmes det også i brugerens webbrowsinghistorik / logfiler for browseren. Disse problemer gør mindre sikker.
  • Imidlertid er en fordel ved formdata, der sendes som en del af URL-adressen, at man kan bogmærke URL’erne og direkte bruge dem og helt omgå formularudfyldningsprocessen.
  • Der er en begrænsning for, hvor meget formdata der kan sendes, fordi URL-længder er begrænsede.
  • Script-kiddies kan lettere udsætte sårbarheder i systemet for at hacke det. For eksempel blev Citibank hacket ved at ændre kontonumre i URL-strengen.[1] Naturligvis kan erfarne hackere eller webudviklere udsætte sådanne sårbarheder, selvom POST bruges; det er bare lidt sværere. Generelt skal serveren være mistænksom over for alle data, der sendes af klienten, og beskytte mod usikre direkte objektreferencer.

Forskelle i server-side-behandling

I princippet afhænger behandlingen af ​​en indsendt formdata af, om de sendes med METODE = "GET" eller METODE = "POST". Da dataene kodes på forskellige måder, er forskellige afkodningsmekanismer nødvendige. Generelt set kan ændring af METODE nødvendigvis kræve en ændring i scriptet, der behandler indsendelsen. Når man f.eks. Bruger CGI-interface, modtager scriptet dataene i en miljøvariabel (QUERYSTRING), når anvendes. Men når STOLPE bruges, formdata sendes i standardinputstrømmen (stdin) og antallet af byte, der skal læses, gives af indholdslængdes overskrift.

Anbefalet brug

GET anbefales, når du indsender "idempotente" formularer - dem, der ikke 'ændrer verdens tilstand væsentligt'. Med andre ord formularer, der kun involverer databaseforespørgsler. Et andet perspektiv er, at adskillige idempotente forespørgsler vil have den samme effekt som en enkelt forespørgsel. Hvis databaseopdateringer eller andre handlinger, såsom udløsende e-mails, er involveret, anbefales brugen af ​​POST.

Fra Dropbox-udviklerbloggen:

en browser ved ikke nøjagtigt, hvad en bestemt HTML-formular gør, men hvis formularen indsendes via HTTP GET, ved browseren, at det er sikkert at prøve igen indsendelsen, hvis der er en netværksfejl. For formularer, der bruger HTTP POST, er det muligvis ikke sikkert at prøve igen, så browseren beder brugeren om bekræftelse først.

En "GET" -anmodning er ofte cache, mens en "POST" -anmodning næppe kan være. For forespørgselssystemer kan dette have en betydelig virkningseffekt, især hvis forespørgselsstrengene er enkle, da cache muligvis tjener de hyppigste forespørgsler.

I visse tilfælde ved hjælp af STOLPE anbefales, selv ved idempotente forespørgsler:

  • Hvis formdataene indeholder ikke-ASCII-tegn (såsom accenttegn) METODE = "GET" er principielt ikke anvendelig, selvom det muligvis fungerer i praksis (hovedsageligt for ISO Latin 1-tegn).
  • Hvis formdatasættet er stort - siger hundreder af tegn - så METODE = "GET" kan forårsage praktiske problemer med implementeringer, der ikke kan håndtere så lange URL'er.
  • Du ønsker måske at undgå METODE = "GET" for at gøre det mindre synligt for brugerne, hvordan formen fungerer, især for at gøre "skjulte" felter (INPUT TYPE = "HIDDEN") mere skjult ved ikke at vises i URL-adressen. Men selv hvis du bruger skjulte felter med METODE = "POST", de vises stadig i HTML-kildekoden.

Hvad med HTTPS?

Opdateret 15. maj 2015: Specielt når HTTPS (HTTP via TLS / SSL) bruges, tilbyder POST mere sikkerhed end GET?

Dette er et interessant spørgsmål. Lad os sige, at du sender en GET-anmodning til en webside:

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

Hvis du antager, at din internetforbindelse overvåges, hvilke oplysninger om denne anmodning vil være tilgængelige for snooper? Hvis der i stedet bruges POST, og bruger- og passwd-data er inkluderet i POST-variabler, vil det være mere sikkert i tilfælde af HTTPS-forbindelser?

Svaret er nej. Hvis du fremsætter en sådan GET-anmodning, vil kun den følgende information være kendt for angriberen, der overvåger din webtrafik:

  1. Det faktum, at du oprettede en HTTPS-forbindelse
  2. Værtsnavnet - www.eksempel.com
  3. Den samlede længde af anmodningen
  4. Reaktionens længde

Stiendelen af ​​URL'en - dvs. den aktuelle side, der ønskes, samt forespørgselsstrengsparametrene - er beskyttet (krypteret), mens de er "over ledningen", dvs. under transit på vej til destinationsserveren. Situationen er nøjagtig den samme for POST-anmodninger.

Naturligvis har webservere en tendens til at logge hele URL'en i almindelig tekst i deres adgangslogger; så det er ikke en god ide at sende følsomme oplysninger over GET. Dette gælder uanset om HTTP eller HTTPS bruges.

Referencer

  • wikipedia: POST (HTTP)
  • HTTP-anmodningsmetoder
  • HTTP-indlæg - W3.org
  • HTTP Hent - W3.org
  • Skjuler HTTPS, hvilke URL'er der er adgang til? - Stakbytte