HTTP STOLPE anmodninger levere yderligere data fra klienten (browseren) til serveren i meddelelsesorganet. I modsætning, FÅ 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.
FÅ | 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 |
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.
Da formdata sendes som en del af URL'en hvornår FÅ anvendes --
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 FÅ 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.
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:
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:
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.