Du har kanskje hørt om informasjonskapsler, men hva er de egentlig og hva kan vi egentlig gjøre med dem? I denne opplæringen vil vi fokusere på grunnleggende informasjonskapsler, og lære om funksjonaliteten i ulike webapplikasjoner og websider. Vi vil også lære å bruke dem i våre PHP- og JavaScript-prosjekter, samtidig som vi tar spesielt hensyn til sikkerhetsproblemer som kan oppstå ved bruk av dem. Etter å ha lest dette, har du oppnådd det nødvendige ferdighetssettet for å implementere informasjonskapsler på en trygg måte i dine egne webapplikasjoner.
Det første trinnet på vår reise er å oppdage akkurat hva disse informasjonskapslene faktisk er! Selv om du allerede har jobbet med dem, kan du fortsatt finne denne delen ganske nyttig - så vær med meg!
Du kan lettest tenke på informasjonskapsler som tekstfiler, som er lagret på datamaskinen. På forespørsel fra en webserver oppretter nettleseren din en slik fil. Etter dette kan webserveren lese og skrive innhold fra og til denne filen. Selv om dette virker som en farlig funksjon - likevel liker ingen andre mennesker å skrive filer til datamaskinen sin, det er noen begrensninger på plass for å gjøre denne prosessen så trygg som mulig.
Cookies har en utløpsdato. Denne datoen er angitt slik at nettleseren kan slette gamle informasjonskapsler når de ikke lenger behøves av webserveren. Hvis utløpsdatoen er tom, vil cookien slettes når forbindelsen til serveren er stengt. Dette skjer når nettstedets vindu eller fane er lukket av brukeren, eller når brukeren lukker hele nettleseren. Disse informasjonskapslene, som ofte kalles øktkaksler, brukes mest for å lagre midlertidige innstillinger.
La oss finne ut hvordan disse tingene ser ut på et teknisk nivå. Informasjonskapsler overføres via HTTP-protokollen. Dette er protokollen som brukes av nettlesere til å hente og sende filer til serveren. Etter at en informasjonskapsel er blitt forespurt, sendes den til serveren hver gang et nytt element på nettsiden hentes av nettleseren. Nedenfor kan vi se en utdrag av en server som ber om en ny informasjonskapsel (denne koden er en del av et HTTP-svar).
Set-Cookie: Navn = innholdsdata; utløper = fre, 31-des-2010 23:59:59 GMT; path = /; domene = .example.net
Nå blir ikke redd, det er alt veldig forståelig!
I neste trinn vurderer vi hvordan disse egenskapene kan brukes i programmeringsspråk.
Cookies kan opprettes på mange måter, men i denne veiledningen vil vi fokusere på PHP og JavaScript.
Det viktigste å huske, når du lager en informasjonskapsel i PHP, er at du må angi alle informasjonskapsler før du sender data til nettleseren. Dette betyr at du burde alltid initialiser nye cookies før noen utdata. Dette inkluderer ekko () eller print () kommandoer, og eller
tags. Selvfølgelig er det noen unntak, men dette er en generell tommelfingerregel.... // alt innhold etc går her?>
Dette burde virke kjent nå, bortsett fra $ sikre og $ kun http. Den "sikre" er å tvinge cookien til å bli sendt bare hvis en HTTPS-tilkobling er opprettet, hvis den er satt til sann, og skal normalt settes til falsk. "Httponly" gjør cookien bare tilgjengelig via HTTP-protokollen, noe som betyr at språk på klientsiden, som JavaScript og VBscript, ikke har tilgang til informasjonskapselen. Dette bidrar til å hindre ekkel ting, for eksempel Cross Site Scripting, og bør settes til ekte hvis du ikke har noen intensjoner om å redigere informasjonskapslene på klientsidet med et språk som JavaScript. For å unngå misforståelser betyr "httponly" ikke at informasjonskapsler ikke kan sendes over HTTPS, fordi de fortsatt kan, faktisk. Vær imidlertid oppmerksom på at ovennevnte kutt kan gjøres ganske mindre (og bør være):
Flott! Nå kan vi lage informasjonskapsler, men vi må også kunne lese dem. Heldigvis for PHP gjør dette veldig enkelt når en cookie allerede er opprettet. I PHP er det en miljøvariabel som kalles $ _COOKIE [], som kan brukes til å utvinne verdien av cookien. For å bruke den, bare legg inn navnet på informasjonskapslet inne i brakettene [] slik:
Denne miljøvariabelen kan brukes som alle andre. Akkurat som $ _GET [] og $ _POST [], kan den behandles direkte som en vanlig variabel (når du har sjekket om cookien faktisk finnes), hvis du vil.
Hvis du vil endre utløpsdatoen, banen eller domenet, må du overskrive en eksisterende informasjonskapsel med setcookie () med samme navn som den opprinnelige informasjonskapselen. Hvis du endrer utløpsdatoen for å være tidligere (tid () - 30 * 60 for eksempel), vil informasjonskapsel bli slettet.
Cookies kan leses og skrives klientsidet også. Selv om JavaScript ikke gir en fin løsning for å lese og skrive informasjonskapsler, er det mulig og mye brukt. JavaScript bruker dokumentet.cookie-objektet for informasjonskapsler, som vist i følgende kodeboks:
// få dagens dato var expiredate = ny Dato (); // øke dato med 5 timer expiredate.setHours (expiredate.getHours () + 5); document.cookie = 'cookiename = cookievalue; utløper = "+ expiredate.toUTCString () +" path = / example /; domain = test.envato.com ';
Som du kanskje har lagt merke til, er denne syntaksen ganske lik HTTP-protokollnotasjonen. Dette har fordelen av å være mer i kontroll, men innfører også noen potensielle problemer. Nedenfor er
var cookieName = 'testcookiename'; var textArray = document.cookie.split (';'); // sette alle delene av strengen i en matrise for (var i = 0; i < textArray.length; i++) // loop though all string pieces var textPiece = textArray[i]; //contains 1 string piece //filter beginning spaces while(textPiece(0)==") textPiece = textPiece.substring(1,textPiece.length); //if the textpiece contains our cookies name if (textPiece.indexOf(cookieName)== 0) //return whats after the cookies name return textPiece.substring(cookieName.length,c.length);
Jeg vet jeg vet; Dette er en smerte. Heldigvis for dere, jeg legger inn noen forhåndskrevne funksjoner under (du vil kanskje lage dine egne funksjoner for læringsformål selv, og du burde!).
funksjon writeCookie (cookieName, cookieValue, expireHours, bane, domene) var date = new Date (); date.setHours (date.getHours + expireHours); document.cookie = cookieName + '=' + cookieValue + '; utløper = "+ dato +"; bane = "+ bane +"; domain = = + domain; function readCookie (cookieName) var textArray = document.cookie.split (";"); for (var i = 0; i < textArray.length; i++) var textPiece = textArray[i]; while(textPiece(0)==") textPiece = textPiece.substring(1,textPiece.length); if (textPiece.indexOf(cookieName)== 0) return textPiece.substring(cookieName.length,c.length);
Vær oppmerksom på at disse utdragene ikke inneholder feilkontroll.
Visste du? -
Cookies ble oppfunnet av Netscape, som ønsket å bruke dem til å lage en handlekurv for en nettbutikk. Takket være informasjonskapsler var folk i stand til å holde varebilen sin, selv etter å ha koblet fra butikken.
I dag bruker vi informasjonskapsler for nesten alle formål du kan tenke på. Du kan bruke dem til å lagre brukerinnstillinger som navn, språk, sted eller skjermstørrelse. Dette kan forbedre kvaliteten på tjenesten du vil tilby for en klient, fordi du kan optimalisere tjenesten for en klient og huske denne optimaliseringen i fremtiden. Du kan for eksempel lagre klientens foretrukne språk til en informasjonskapsel, og deretter vise innholdet på nettstedet ditt på det foretrukne språket hver gang klienten besøker nettstedet ditt.
Selvfølgelig er det nok morsommere ting å gjøre med cookies enn dette! I neste trinn vil jeg vise deg et eksempel på en kul kodebit.
Endelig! Nå kan vi begynne å skrive noen kjempekode! Nedenfor er en bonusbit, som bruker informasjonskapsler for å opprette en relogin-mekanisme.
Før vi begynner inneholder denne koden noen MySQL-kode. Hvis du ikke er kjent med MySQL, ikke vær panikk. Selv om denne brikken er litt vanskelig, bør det være forståelig med litt grunnleggende PHP og informasjonskapsler.
For å lage en "husk meg" implementering, må vi ha noen ting. For det første trenger vi en database tabell med brukernavn, passord og identifikasjonsfelt. For det andre trenger vi en unik streng eller et nummer for å identifisere klienter trygt gjennom informasjonskapsler (dette er identifikasjonen i databasetabellen). I denne utgaven bruker vi en SHA-1-fordøyelse, som bare er en streng, som en identifikator. Når det brukes riktig, gir dette utmerket sikkerhet.
De fleste legger bare inn et brukernavn og passord i informasjonskapselen, og sender den automatisk til serveren. Dette bør unngås til enhver tid! Informasjonskapsler sendes vanligvis via en usikker tilkobling, slik at innholdet lett kan sees av potensielle angripere.
brukernavn; // her bør du sette en ny fordøyelse for neste relogin ved hjelp av koden ovenfor! ekko 'Du har logget inn,'. $ brukernavn; ellers // digest eksisterte ikke (eller flere av de samme fordøyelsene ble funnet, men det kommer ikke til å skje) ekko "klarte ikke å logge inn!"; ?>
Ved å bruke en fordøyelse som vi gjorde, er sjansene for å få to av samme fordøyelse lite. En fordøyelse er en førti tegnstreng, som i teorien alltid skal gi en komplett tilfeldig utgang dersom inngangen endres. I praksis bør du legge til en tidsbegrensning i serverside-koden, slik at fordøyelsen ikke er gyldig etter X minutter. Dette forhindrer angriperne i å kopiere andres informasjonskapsler og bruke dem til å logge inn.
Vi har nesten nådd slutten av denne opplæringen. Som konklusjon vil jeg gjerne oppsummere noen gode praksiser:
Jeg håper du har lært litt fra dagens Nettuts + opplæring. Hvis du har spørsmål, vær så snill å legge igjen en kommentar eller si hei på Twitter.