O introducere în cookie-uri

S-ar putea să fi auzit despre cookie-uri, dar ce anume sunt și ce putem face cu ei? În acest tutorial, ne vom concentra pe elementele de bază ale modulelor cookie și vom afla despre funcționalitatea acestora în diferite aplicații web și în medii de site. Vom învăța, de asemenea, cum să le folosim în cadrul proiectelor noastre PHP și JavaScript, acordând o atenție deosebită problemelor de securitate care ar putea apărea atunci când le folosiți. După ce ați citit acest lucru, veți fi achiziționat setul de competențe necesar pentru a implementa cookie-urile în siguranță în propriile aplicații web.


Pasul 1. Înțelegerea modulelor cookie

Primul pas în călătoria noastră este să descoperim exact ce sunt aceste cookie-uri! Chiar dacă ați lucrat deja cu ei, ați putea găsi încă această parte destul de utilă - stați cu mine!

Abstract

Puteți să vă gândiți cel mai ușor la cookie-uri ca fișiere text, care sunt salvate pe computer. La cererea unui server web, browser-ul dvs. creează un astfel de fișier. După aceasta, serverul web poate citi și scrie conținut din și în acest fișier. Deși acest lucru pare a fi o caracteristică periculoasă - la urma urmei, nimănui nu îi plac alte persoane să scrie fișiere pe computerul lor, există câteva restricții pentru a face acest proces cât mai sigur posibil.

  • Serverele Web pot accesa numai cookie-urile care sunt setate pe propriul domeniu. Acest domeniu este setat de browser atunci când un server cookie este solicitat de serverul web și poate fi doar un domeniu sau un subdomeniu al serverului web (serverul web poate alege un subdomeniu dacă dorește). Aceasta înseamnă că modulele cookie care au fost setate, de exemplu, google.com, nu pot fi citite de mozilla.com și invers.
  • Conform protocolului HTTP, modulele cookie nu pot fi mai mari decât 4096 Bytes (4KB) fiecare.
  • Există o limită a numărului de cookie-uri pe domeniu. Numărul diferă în funcție de browser, cu toate acestea, limita generală utilizată este de douăzeci de module cookie. Acest lucru este pentru a împiedica un singur domeniu de la hogging spațiu pe disc a clientului.
  • Există o limită a numărului total de cookie-uri pe harddisk-ul clientului. De asemenea, acest număr diferă în funcție de browser, dar este, de obicei, limitat la aproximativ trei sute de cookie-uri. Când acest număr este depășit, un cookie mai vechi este șters înainte de crearea unui nou.

Cookie-urile au o dată de expirare. Această dată este setată astfel încât browserul să poată șterge cookie-urile vechi atunci când acestea nu mai sunt necesare de serverul web. Dacă data de expirare este goală, cookie-ul va fi șters când conexiunea cu serverul este închisă. Aceasta se întâmplă când fereastra sau fila site-ului este închisă de utilizator sau atunci când utilizatorul închide întregul browser. Aceste cookie-uri, numite uneori cookie-uri de sesiune, sunt utilizate în principal pentru stocarea setărilor temporare.

Tehnic

Să vedem cum arată aceste lucruri la nivel tehnic. Cookie-urile sunt transferate prin protocolul HTTP. Acesta este protocolul utilizat de browsere pentru a prelua și a trimite fișiere către server. După ce un cookie a fost solicitat, acesta este trimis la server de fiecare dată când un element nou de pe pagina web este preluat de browser. Mai jos, putem vedea un fragment dintr-un server care solicită un nou modul cookie (acest fragment face parte dintr-un răspuns HTTP).

 Set-Cookie: Name = date despre conținut; expiră = Vineri, 31-Dec-2010 23:59:59 GMT; path = /; domeniu = .example.net

Acum nu te speria, este foarte ușor de înțeles!

  • Set-Cookie: este de a lăsa browserul să știe că serverul ar dori să creeze un cookie nou.
  • Nume este numele cookie-ului. Fiecare modul cookie dintr-un domeniu trebuie să aibă un nume diferit, astfel încât browserul să poată păstra toate cookie-urile separate. După ce vine numele = date despre conținut unde "date de conținut" sunt datele care vor fi conținute în cookie. Aceste date pot fi un șir de text sau un număr și, după cum se spune, pot avea o dimensiune de până la 4KB.
  • expira = este comanda pentru data de expirare. Data expirării este în formatul "Wdy, DD-Mon-YYYY HH: MM: SS GMT" (Nu mă întreba de ce a fost definită în acest format rediculos, pentru că nici eu nu știu. data de expirare, deci de ce deșeurile de memorie, spațiul pe hard disk și lățimea de bandă pe date lungi?). Nu vă faceți griji, totuși, pentru că majoritatea limbajelor de programare au funcții ușor de utilizat disponibile pentru dvs. Browserul șterge automat cookie-urile cu o dată de expirare în trecut.
  • domeniu și cale necesită o explicație mai profundă. domeniu este domeniul în care cookie-ul va fi activ. Dacă domeniul este "ads.google.com", fișierul cookie va fi trimis numai pe serverul respectivului domeniu și, dacă domeniul este "google.com", fișierul cookie va fi trimis către orice server din oricare din subdomeniile Google, inclusiv Google.com în sine.
  • cale este calea domeniului la care este trimis cookie-ul. Aceasta înseamnă că, dacă calea este setată la "/ images /," și domeniul este setat la "ads.google.com", fișierul cookie va fi trimis la server numai dacă browserul solicită un fișier din "ads.google .com / images /“. Dacă calea este setată la '/', fișierul cookie va fi trimis către server, indiferent de locația fișierului solicitat de pe server.

În următorul pas, vom examina modul în care aceste proprietăți pot fi utilizate în limbile de programare.


Pasul 2. Cum se creează și se citesc modulele cookie

Cookie-urile pot fi create în mai multe moduri, dar, în scopul acestui tutorial, ne vom concentra pe PHP și JavaScript.

PHP

Cel mai important lucru de reținut, atunci când creați un cookie în PHP, este că trebuie să setați toate cookie-urile înainte de a trimite orice date către browser. Asta înseamnă că ar trebui mereu inițializați cookie-urile noi inainte de orice ieșire. Acestea includ comenzile eco () sau print () și sau Etichete. Desigur, există câteva excepții, dar aceasta este o regulă generală.

 ... // tot continutul etc merge aici?

Acest lucru ar părea familiar până acum, cu excepția cazului $ sigure și $ HttpOnly. Modul "sigur" este de a forța modulul cookie să fie trimis numai dacă a fost stabilită o conexiune HTTPS, dacă este setată la adevărată și în mod normal trebuie setată la falsă. Site-ul "httponly" face ca cookie-ul să fie disponibil doar prin protocolul HTTP, ceea ce înseamnă că limbile de la client, cum ar fi JavaScript și VBscript, nu pot accesa cookie-ul. Acest lucru ajută la prevenirea unor lucruri urâte, cum ar fi Cross Site Scripting, și ar trebui să fie setat la adevărat dacă nu aveți intenția de a edita cookie-urile cu o limbă ca JavaScript. De asemenea, pentru a preveni concepțiile greșite, "httponly" nu înseamnă că cookie-urile nu pot fi trimise prin HTTPS, pentru că ele încă pot, de fapt. Cu toate acestea, rețineți că fragmentul de mai sus poate fi mai mic (și ar trebui să fie):

 

Grozav! Acum putem crea cookie-uri, dar trebuie să le putem citi, de asemenea. Din fericire pentru noi, PHP face acest lucru foarte ușor odată ce un cookie a fost deja creat. În PHP, există o variabilă de mediu denumită $ _COOKIE [], care poate fi utilizată pentru extragerea valorii cookie-ului. Pentru a le folosi, introduceți numele cookie-ului în interiorul parantezelor [] așa cum este cazul:

 

Această variabilă de mediu poate fi utilizată ca oricare alta. La fel ca $ _GET [] și $ _POST [], acesta poate fi tratat direct ca o variabilă normală (odată ce ați verificat dacă cookie-ul există cu adevărat desigur), dacă doriți.

Dacă doriți să modificați data de expirare, calea sau domeniul, trebuie să suprascrieți un cookie existent cu setcookie () folosind același nume ca și cookie-ul original. Dacă modificați data de expirare în trecut (timp () - 30 * 60 de exemplu), cookie-ul va fi șters.

JavaScript

Cookie-urile pot fi citite și scrise și pe client. Chiar dacă JavaScript nu oferă o soluție frumoasă pentru a citi și scrie cookie-uri, este posibil și utilizat pe scară largă. JavaScript utilizează obiectul document.cookie pentru manipularea cookie-urilor, așa cum se arată în fragmentul următor:

 // a lua data curentă var expiredate = new Date (); // crește data cu 5 ore expiredate.setHours (expiredategetGet () + 5); document.cookie = 'cookename = cookievalue; expire = "+ expiredatetoUTCString () +" calea = / exemplu /; domeniu = test.envato.com ';

Așa cum ați fi observat, această sintaxă este destul de similară cu notația protocolului HTTP. Acest lucru are avantajul de a fi mai controlat, dar introduce și unele probleme potențiale. Mai jos este fragment pentru citirea unui modul cookie.

 var cookieName = 'testcookiename'; var textArray = document.cookie.split (';'); // pune toate părțile șirului într-o matrice pentru (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);  

Știu, știu; aceasta este o durere. Din fericire pentru voi, postrez câteva funcții pre-scrise mai jos (poate doriți să vă faceți propriile funcții în scopuri de învățare, totuși, și ar trebui!).

 funcția writeCookie (cookieName, cookieValue, expireHours, cale, domeniu) var date = new Date (); date.setHours (data.getHours + expireHours); document.cookie = cookieName + '=' + cookieValue + '; expiră = "+ data +"; calea = "+ cale +"; domain = "+ domain; funcția readCookie (cookieName) var textArray = document.cookie.split ("; '); pentru (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);  

Rețineți că aceste fragmente nu conțin nici o verificare a erorilor.


Pasul 3. Ce să faceți cu cookie-urile

Știați? -
Cookie-urile au fost inventate de Netscape, care a vrut să le folosească pentru a crea un coș de cumpărături pentru un magazin online. Datorită cookie-urilor, oamenii au putut să-și păstreze produsele, chiar și după deconectarea de la magazin.

În zilele noastre, folosim cookie-uri pentru aproape toate scopurile pe care le puteți gândi. Puteți să le utilizați pentru a salva setările utilizatorului cum ar fi numele, limba, locația sau dimensiunea ecranului. Acest lucru poate îmbunătăți calitatea serviciului pe care doriți să îl furnizați unui client, deoarece puteți optimiza serviciul pentru un client și amintiți-vă această optimizare în viitor. De exemplu, puteți salva limbajul preferat al clientului într-un modul cookie și, ulterior, afișați conținutul site-ului dvs. în limba preferată de fiecare dată când clientul vizitează site-ul dvs..

Desigur, există mult mai multe lucruri distractive de a face cu cookie-uri decât asta! În pasul următor, vă voi arăta un exemplu de fragment de cod cool.


Pasul 4. Scrierea mesajelor răcoritoare

In cele din urma! Acum putem începe să scriem niște coduri minunate! Mai jos este un fragment de bonus, care utilizează module cookie pentru a crea un mecanism de relogin.

"Amintește-mi de mine" fragment de login

Înainte de a începe, acest fragment conține un cod MySQL. Dacă nu sunteți familiarizat cu MySQL, nu vă faceți griji. Chiar dacă acest fragment este un pic dificil, ar trebui să fie ușor de înțeles cu un pic de cunoștințe de bază PHP și cookie.

Pentru a crea o implementare "memorează-mă", trebuie să avem câteva lucruri. În primul rând, avem nevoie de o tabelă de bază de date care să conțină un nume de utilizator, o parolă și un câmp de identificare. În al doilea rând, avem nevoie de un șir sau de un număr unic pentru a identifica clienții în siguranță prin cookie-uri (aceasta este identificarea în tabelul de baze de date). În acest fragment, vom folosi o digestă SHA-1, care este doar un șir, ca un identificator. Atunci când este folosit în mod corespunzător, acest lucru oferă o securitate excelentă.

Majoritatea oamenilor trebuie doar să introducă un nume de utilizator și o parolă în cookie și să o trimită automat serverului. Acest lucru trebuie evitat în orice moment! Modulele cookie sunt trimise de obicei printr-o conexiune nesigură, astfel încât conținutul ar putea fi văzut cu ușurință de către eventualii atacatori.

 nume de utilizator; // aici ar trebui să setați o digestă nouă pentru următorul relogin folosind codul de mai sus! echo 'Ai conectat cu succes,'. $ username;  altceva // digestul nu exista (sau mai multe digesturi s-au gasit, dar asta nu se va intampla) ecou "nu a reusit sa te inregistrezi!"; ?>

Folosind un digest ca și noi, șansele de a obține două din același digest este minuțios. Un digest este un șir de caractere de patruzeci de caractere, care, teoretic, ar trebui să furnizeze întotdeauna o extragere completă aleatorie dacă intrarea este schimbată. În practică, ar trebui să adăugați o limită de timp în codul de pe server, astfel încât digestul să nu fie valabil după X minute. Acest lucru împiedică atacatorii să copieze cookie-urile cuiva și să le folosească pentru a se conecta.


Pasul 5. Cele mai bune practici

Aproape am ajuns la sfârșitul acestui tutorial. Ca o concluzie, aș dori să rezumă câteva bune practici:

  • Nu introduceți niciodată date sensibile într-un modul cookie. Un client ar putea naviga pe un computer public, așa că nu lăsați nici o informație personală în urmă.
  • Nu aveți încredere niciodată în datele provenite de la modulele cookie. Filtrați întotdeauna șiruri și numere! Un atacator ar putea scrie cookie-urilor cu date rău intenționate pentru a face ceva ce nu doriți ca serviciul dvs. să facă.
  • Încercați să estimați durata de valabilitate a cookie-ului și setați data de expirare în consecință. Nu doriți să vă îngrijorați computerul clientului cu cookie-uri vechi, care vor expira la o sută de ani.
  • Setați întotdeauna setul securizat și httponly pentru a satisface cererile dvs. de aplicație. Dacă aplicația dvs. nu modifică cookie-urile cu JavaScript, activați httponly. Dacă aveți întotdeauna o conexiune HTTPS, activați securizarea. Acest lucru îmbunătățește integritatea și confidențialitatea datelor.

Concluzie

Sper că ați învățat puțin din tutorialul Nettuts + de astăzi. Dacă aveți întrebări, nu ezitați să lăsați un comentariu sau să spuneți pe Twitter.

Cod