I dette siste kapittelet vil vi se på sikkerhetsaspekter av HTTP, inkludert hvordan du identifiserer brukere, hvordan HTTP-godkjenning fungerer, og hvorfor enkelte scenarier krever HTTPS (sikker HTTP). Underveis skal vi også lære litt om hvordan man styrer tilstanden med HTTP.
HTTP er en statsløs protokoll, som betyr at hver forespørsel / respons-transaksjon er uavhengig av tidligere eller fremtidige transaksjoner. Det er ingenting i HTTP-protokollen som krever at en server beholder informasjon om en HTTP-forespørsel. Alt serveren trenger å gjøre er å generere et svar for hver forespørsel. Hver forespørsel vil bære all den informasjonen en server trenger for å skape svaret.
Den statsløse naturen til HTTP er en av drivkraften i webens suksess. De lagrede tjenestene vi så på i forrige kapittel, tjenester som caching, er alle gjort mulig (eller i det minste enklere) fordi hver melding inneholder all informasjon som kreves for å behandle meldingen. Proxy-servere og webservere kan inspisere, transformere og cache meldinger. Uten caching kunne nettet ikke skalere for å møte kravene fra Internett.
Imidlertid er de fleste webapplikasjonene og tjenestene vi bygger på toppen av HTTP, meget statlige.
En bankapplikasjon vil kreve at en bruker logger på før brukeren kan se hans eller hennes kontorelaterte ressurser. Når hver statsløs forespørsel kommer til en privat ressurs, ønsker søknaden å sikre at brukeren allerede var godkjent. Et annet eksempel er når brukeren ønsker å åpne en konto og fyller ut skjemaer i en tre-sidig veiviser. Søknaden vil sørge for at første side i veiviseren er fullført før du lar brukeren sende inn den andre siden.
Heldigvis er det mange alternativer for lagring av stat i et webprogram. En tilnærming er å legge inn tilstanden i ressursene som overføres til klienten, slik at all staten som kreves av søknaden, vil reise tilbake på neste forespørsel. Denne tilnærmingen krever vanligvis noen skjulte innsendingsfelter og fungerer best for kortvarig tilstand (som staten krever for å bevege seg gjennom en tre-siders veiviser). Embedding-tilstanden i ressursen holder hele staten inne i HTTP-meldinger, så det er en svært skalerbar tilnærming, men det kan komplisere applikasjonsprogrammering.
Et annet alternativ er å lagre staten på serveren (eller bak serveren). Dette alternativet er nødvendig for tilstand som må være rundt en lang tid. La oss si at brukeren sender et skjema for å endre e-postadressen sin. E-postadressen må alltid være tilknyttet brukeren, slik at søknaden kan ta den nye adressen, validere adressen og lagre adressen i en database, en fil eller ringe en webtjeneste for å la noen andre ta vare på å lagre adressen.
For server-side lagring, gir mange webutviklingsrammer som ASP.NET også tilgang til en "bruker økt". Økten kan leve i minnet eller i en database, men en utvikler kan lagre informasjon i økten og hente informasjonen på hver etterfølgende forespørsel. Data lagret i en økt er scoped til en individuell bruker (faktisk til brukerens nettlesingsøkt), og deles ikke mellom flere brukere.
Session lagring har en enkel programmeringsmodell og er bare bra for kortvarig tilstand, fordi serveren til slutt må anta at brukeren har forlatt nettstedet eller lukket nettleseren, og serveren vil kaste opp økten. Session lagring, hvis lagret i minnet, kan påvirke skalerbarheten negativt fordi etterfølgende forespørsler må gå til nøyaktig samme server der sessionsdataene ligger. Noen lastbalansere bidrar til å støtte dette scenariet ved å implementere "klebrig sessioner".
Du lurer kanskje på hvordan en server kan spore en bruker for å implementere økttilstand. Hvis to forespørsler kommer til en server, hvordan vet serveren om det er to forespørsler fra samme bruker, eller hvis det er to forskjellige brukere som hver foretar en enkelt forespørsel?
I de tidlige dagene på Internett kan serverprogramvaren ha differensierte brukere ved å se på IP-adressen til en forespørselsmelding. I disse dager lever imidlertid mange brukere bak enheter som bruker nettverksadresseversjon, og av dette og andre grunner kan du få flere brukere effektivt på samme IP-adresse. En IP-adresse er ikke en pålitelig teknikk for å differensiere brukere.
Heldigvis er det mer pålitelige teknikker.
Nettsteder som vil spore brukere, vil ofte vende seg til kjeks. Informasjonskapsler er definert av RFC6265 (http://tools.ietf.org/html/rfc6265), og denne RFC er passende med tittelen "HTTP State Management Mechanism". Når en bruker først besøker et nettsted, kan nettstedet gi brukerens nettleser en informasjonskapsel ved hjelp av en HTTP-header. Nettleseren vet da å sende informasjonskapselen i overskriftene til hver ekstra forespørsel den sender til nettstedet. Forutsatt at nettstedet har plassert en slags unik identifikator i cookien, kan nettstedet nå spore en bruker som han eller hun gjør forespørsler, og skille en bruker fra en annen.
Før vi kommer inn i flere detaljer om hva informasjonskapsler ser ut og hvordan de oppfører seg, er det verdt å merke seg et par begrensninger. For det første kan informasjonskapsler identifisere brukere i den forstand at cookien din er forskjellig fra min informasjonskapsel, men cookies godkjenner ikke brukere. En autentisert bruker har bevist sin identitet, vanligvis ved å gi legitimasjon som et brukernavn og passord. Kakene vi snakker om så langt, bare gi oss noen unike identifikatorer for å skille en bruker fra en annen, og spore en bruker ettersom forespørsler er gjort på nettstedet.
For det andre, siden informasjonskapsler kan spore hva en bruker gjør, øker de personvernproblemer i noen kretser. Noen brukere vil deaktivere informasjonskapsler i nettleserne, noe som betyr at nettleseren vil avvise eventuelle cookies en server sender i et svar. Deaktiverte informasjonskapsler presenterer et problem for nettsteder som må spore brukere, selvfølgelig, og alternativene er rotete. For eksempel er en tilnærming til "cookieless-økter" å plassere brukeridentifikatoren i URL-adressen. Cookieless økter krever at hver webadresse et nettsted gir til en bruker inneholder riktig identifikator, og nettadressene blir mye større (det er derfor denne teknikken kalles ofte "fed URL" -teknikken).
Når et nettsted ønsker å gi en bruker en informasjonskapsel, bruker den en Set-Cookie
header i en HTTP-respons.
HTTP / 1.1 200 OK Innholdstype: tekst / html; charset = utf-8 Set-Cookie: fname = Scott $ lname = Allen; domene = .mywebsite.com; path = / ...
Det er tre områder med informasjon i informasjonskapselen vist i denne prøven. De tre områdene er avgrenset av semikolon (;). For det første er det ett eller flere navn-verdi par. Disse navneparametrene er avgrenset av et dollarskilt ($), og ser veldig ut som hvordan søkeparametere formateres til en nettadresse. I eksempelkaken ønsket serveren å lagre brukerens fornavn og etternavn i informasjonskapsel. Det andre og tredje området er henholdsvis domene og sti. Vi sirkler tilbake senere for å snakke om domene og sti.
Et nettsted kan legge inn informasjon som den liker i en informasjonskapsel, selv om det er en størrelsesbegrensning på 4 KB. Imidlertid legger mange nettsteder bare inn en unik identifikator for en bruker, kanskje en GUID. En server kan aldri stole på noe som er lagret på klienten, med mindre det er kryptografisk sikret. Ja, det er mulig å lagre krypterte data i en informasjonskapsel, men det er vanligvis lettere å lagre en ID.
HTTP / 1.1 200 OK Set-Cookie: GUID = 00a48b7f6a4946a8adf593373e53347c; domene = .msn.com; path = /
Forutsatt at nettleseren er konfigurert til å godta informasjonskapsler, sender nettleseren kaken til serveren i hver etterfølgende HTTP-forespørsel.
GET ... HTTP / 1.1 Cookie: GUID = 00a48b7f6a4946a8adf593373e53347c; ...
Når ID-en kommer, kan serverprogramvaren raskt se opp tilknyttede brukerdata fra en dataoppbygging, database eller distribuert buffer i minnet. Du kan konfigurere de fleste webapplikasjonsrammer for å manipulere informasjonskapsler og automatisk slå opp økttilstand. For eksempel, i ASP.NET, Økt
objektet avslører en enkel API for å lese og skrive en brukers økt tilstand. Som utviklere trenger vi aldri å bekymre oss for å sende en Set-Cookie
header eller lesing av innkommende informasjonskapsler for å finne den tilknyttede øktstaten. Bak kulissene vil ASP.NET styre øktkaken.
Session ["firstName"] = "Scott"; // skrive økt tilstand ... var lastName = Session ["lastName"]; // lesesesjonstilstand
Igjen er det verdt å påpeke at fornavn
og etternavn
data lagret i sesjonsobjektet er går ikke inn i informasjonskapselen. Kaken inneholder bare en øktidentifikator. Verdiene knyttet til sesjonsidentifikatoren er sikre på serveren. Som standard går øktdataene inn i en datainnsamling i minnet og holder seg i live i 20 minutter. Når en øktkake kommer inn i en forespørsel, vil ASP.NET knytte de riktige øktdataene sammen med Økt
objekt etter å ha funnet brukerens data ved hjelp av IDen som er lagret i informasjonskapsel. Hvis det ikke er innkommende informasjonskapsel med en økt-ID, vil ASP.NET opprette en med en Set-Cookie
Overskrift.
En sikkerhetsproblemer rundt øktidentifikatorer er hvordan de kan åpne muligheten for at noen kapsler en annen brukeres økt. Hvis jeg for eksempel bruker et verktøy som Fiddler til å spore HTTP-trafikk, kan jeg se en Set-Cookie
header kommer fra en server med SessionId = 12
innsiden. Jeg kan gjette at en annen bruker allerede har en Øktnummer
av 11, og opprett en HTTP-forespørsel med den IDen for å se om jeg kan stjele eller vise HTML-en som er beregnet for en annen bruker. For å bekjempe dette problemet, vil de fleste webapplikasjoner bruke store tilfeldige tall som identifikatorer (ASP.NET bruker 120 bits tilfeldig). En ASP.NET sesjonsidentifikator ser ut som følgende, noe som gjør det vanskeligere å gjette hva andres økt-ID ville se ut som.
Set-Cookie: ASP.NET_SessionId = en5yl2yopwkdamv2ur5c3z45; path = /; kun http
Et annet sikkerhetsproblem rundt informasjonskapsler er hvor sårbar de er for et kryss-site scripting attack (XSS). I et XSS-angrep spruter en ondsinnet bruker ondsinnet JavaScript-kode inn i andres nettsider. Hvis det andre nettstedet sender det skadelige skriptet til brukerne, kan det skadelige skriptet modifisere, eller inspisere og stjele informasjon om informasjonskapsler (som kan føre til øktkapning eller verre).
For å bekjempe dette sikkerhetsproblemet introduserte Microsoft kun http
flagg (sett i det siste Set-Cookie
eksempel). De kun http
flagg forteller brukeragenten å ikke tillate skriptkoden å få tilgang til informasjonskapselen. Cookien eksisterer for "bare HTTP" -i.e. å reise ut i overskriften til hver HTTP-forespørselsmelding. Nettlesere som implementerer kun http
vil ikke tillate JavaScript å lese eller skrive informasjonskapselen på klienten.
Kakene vi har sett så langt er økt informasjonskapsler. Session-informasjonskapsler finnes for en enkelt brukersession og blir ødelagt når brukeren lukker nettleseren. Vedvarende informasjonskapsler kan overleve en enkelt surfing og en brukeragent lagrer informasjonskapslene på disken. Du kan slå av en datamaskin og komme tilbake en uke senere, gå til favorittwebområdet ditt, og en vedvarende informasjonskapsel vil fortsatt være der for den første forespørselen.
Den eneste forskjellen mellom de to er at en vedvarende kake trenger en utløper
verdi.
Set-Cookie: navn = verdi; utløper = mandag, 09-juli-2012 21:12:00 GMT
En øktkake kan eksplisitt legge til en kast
attributt til en informasjonskapsel, men uten en utløper
verdi, bør brukeragenten kaste cookien i alle fall.
Så langt har vi sagt at når en cookie er satt av et nettsted, vil cookien reise til nettsiden med hver etterfølgende forespørsel (forutsatt at cookien ikke er utløpt). Imidlertid reiser ikke alle informasjonskapsler til hvert nettsted. De eneste informasjonskapslene en brukeragent burde sende til et nettsted, er informasjonskapslene som er gitt til brukeragenten på samme nettsted. Det ville ikke være fornuftig for informasjonskapsler fra amazon.com for å være i en HTTP-forespørsel til google.com. Denne typen oppførsel kunne bare åpne opp flere sikkerhets- og personvernproblemer. Hvis du angir en informasjonskapsel som svar på en forespørsel til www.server.com, vil den resulterende informasjonskapselen bare reise i forespørsler til www.server.com.
En webapplikasjon kan også endre omfanget av en informasjonskapsel for å begrense informasjonskapselen til en bestemt vert eller et domene, og til og med til en bestemt ressurssti. Nettprogrammet styrer omfanget ved hjelp av domene
og sti
egenskaper.
HTTP / 1.1 200 OK Set-Cookie: navn = verdi; domene = .server.com; path = / ting ...
De domene
Attributt tillater en informasjonskapsel å spanne underdomener. Med andre ord, hvis du setter en informasjonskapsel fra www.server.com, vil brukeragenten bare levere informasjonskapselen til www.server.com. Domenet i forrige eksempel tillater også at informasjonskapselen kan reise til en hvilken som helst URL i server.com-domenet, inkludert images.server.com, help.server.com og bare vanlig server.com. Du kan ikke bruke domenetattributtet til å spore domener, slik at domenet til .microsoft.com som svar på .server.com ikke er lovlig, og brukeragenten bør avvise informasjonskapsel.
De sti
Attributt kan begrense en informasjonskapsel til en bestemt ressurssti. I det forrige eksempelet vil cookien bare reise til et server.com-nettsted når forespørselsadressen peker på /ting
, eller et sted under /ting
, som / stuff / bilder
. Baninnstillinger kan bidra til å organisere informasjonskapsler når flere lag bygger webapplikasjoner på forskjellige baner.
Cookies tillater nettsteder å lagre informasjon i klienten, og informasjonen vil reise tilbake til nettstedene i etterfølgende forespørsler. Fordelene med webutvikling er enorme, fordi informasjonskapsler tillater oss å holde oversikt over hvilken forespørsel som tilhører hvilken bruker. Men, informasjonskapsler har noen problemer som vi allerede har rørt på.
Cookies har vært utsatt for XSS-angrep som vi tidligere har nevnt, og mottar også dårlig publisitet når nettsteder (spesielt annonseringssteder) bruker tredjeparts cookies å spore brukere over Internett. Tredjeparts cookies er informasjonskapsler som blir angitt fra et annet domene enn domenet i nettleserens adressefelt. Tredjeparts-cookies har denne muligheten fordi mange nettsteder, når de sender en sidebilde tilbake til klienten, vil inkludere koblinger til skript eller bilder fra andre nettadresser. Forespørsmålene som går til de andre nettadressene, tillater de andre nettstedene å angi informasjonskapsler.
For eksempel kan hjemmesiden på server.com inkludere en >