int setcookie (nume șir [, valoare șir [, int expire [, cale șir [, domeniu șir [, int secure]]]]])

Setcookie() specifică cookie-ul care urmează să fie trimis împreună cu restul informațiilor din antet. Cookie-urile trebuie trimise inainte de orice alte anteturi (aceasta este o limitare a cookie-urilor, nu PHP). Acest lucru necesită să efectuați apeluri la această funcție înaintea etichetelor sau. Toate argumentele, cu excepția numelui, sunt opționale. Dacă este furnizat doar un argument de nume, cookie-ul cu acel nume va fi șters de pe clientul de la distanță. De asemenea, puteți înlocui orice argument cu șirul gol ("") pentru a omite acel argument. Expira și argumentele sigure sunt numere întregi / întreg și nu pot fi sărite folosind o linie goală. Folosiți zero (0) în ele. Argumentul expirare este un număr întreg de timp Unix normal, așa cum este returnat de time() sau mktime() . Argumentul securizat specifică faptul că acest cookie ar trebui trimis numai printr-o conexiune HTTPS securizată. Odată ce cookie-urile sunt setate, acestea pot fi accesate la încărcarea paginii următoare prin matricea $_COOKIE (care se numește $HTTP_COOKIE_VARS în versiunile PHP anterioare 4.1.0). Capcane frecvente: cookie-urile nu vor fi vizibile până la încărcarea paginii următoare. Cookie-urile trebuie șterse cu aceleași setări cu care au fost setate. În PHP 3, apelurile multiple către setcookie() în același script pot fi făcute în ordine inversă. Dacă încercați să ștergeți un cookie înainte de a introduce altul, trebuie să faceți inserarea înainte de ștergere. În PHP 4, apelurile multiple către setcookie() sunt executate în ordinea în care sunt apelate. Următoarele sunt exemple de trimitere de cookie-uri:
Rețineți că partea de valoare a cookie-ului va fi codificată automat când cookie-ul este trimis, iar când este primit, este automat decodat și atribuit unei variabile cu același nume ca și numele cookie-ului. Pentru a vizualiza conținutul cookie-ului nostru de testare într-un script, utilizați pur și simplu unul dintre următoarele exemple: Pentru mai multe informații despre cookie-uri, consultați specificația Netscape la: http://www.netscape.com/newsref/std/cookie_spec.html. Microsoft Internet Explorer 4 cu Service Pack 1 nu funcționează corect cu module cookie care au setat parametrul cale. Netscape Communicator 4.05 și Microsoft Internet Explorer 3.x nu procesează corect cookie-urile dacă calea și ora nu sunt setate.

Ultima actualizare: 1/11/2015

Cookie-urile sunt seturi mici de date (nu mai mult de 4 kBytes) cu ajutorul cărora un site web poate stoca orice informație pe computerul utilizatorului. Folosind cookie-uri, puteți urmări activitatea utilizatorului pe site: dacă utilizatorul este sau nu conectat pe site, urmăriți istoricul vizitelor sale etc.

Salvarea cookie-urilor

Pentru a salva cookie-uri pe computerul utilizatorului, utilizați funcția setcookie(). Are următoarea definiție:

Bool setcookie(șir $nume, șir $valoare, int $expire, șir $cale, șir $domeniu, bool $secure, bool $httpdoar);

Funcția setcookie() poate accepta următorii parametri:

    nume: numele cookie-ului care va fi folosit pentru a accesa valoarea acestuia

    valoare: valoarea sau conținutul cookie-ului - orice text alfanumeric nu mai mare de 4 kBytes

    expire (opțional): Data de expirare după care cookie-urile sunt distruse. Dacă acest parametru nu este setat sau este egal cu 0, atunci cookie-ul este distrus după închiderea browserului.

    cale (opțional): cale către directorul de pe server pentru care vor fi disponibile cookie-urile. Dacă specificați „/”, cookie-urile vor fi disponibile pe tot site-ul. Dacă setați, de exemplu, „/mydir/”, cookie-urile vor fi accesibile numai din director /mydir/"și toate subdirectoarele sale. Valoarea implicită este directorul curent în care sunt instalate cookie-urile.

    domeniu (opțional): Specifică domeniul pentru care vor fi disponibile cookie-urile. Dacă este un domeniu de nivel al doilea, de exemplu, localhost.com, apoi cookie-urile sunt disponibile pentru întregul site localhost.com, inclusiv subdomeniile acestuia, cum ar fi blog.localhost.com.

    Dacă este specificat un subdomeniu blog.localhost.com, atunci cookie-urile sunt disponibile numai în cadrul respectivului subdomeniu.

    secure (opțional): Specifică faptul că valoarea cookie-ului trebuie trimisă prin HTTPS. Dacă este setat la true , un cookie de la client va fi trimis la server numai dacă este stabilită o conexiune securizată. Implicit la false.

    httponly (opțional): dacă este adevărat, cookie-urile vor fi accesibile numai prin protocolul http. Adică, cookie-urile în acest caz nu vor fi disponibile pentru limbaje de scripting, de exemplu, JavaScript. Implicit, parametrul este false

Să salvăm cookie-urile:

$value1 = "Singapore"; $value2 = „Chinez”; setcookie("oraș", $valoare1); setcookie("limba", $valoare2, ora()+3600); // perioada de valabilitate 1 ora

Două cookie-uri sunt setate aici: „oraș” și „limbă”. Primul cookie este distrus după închiderea browserului, iar al doilea după 3600 de secunde, adică după o oră

Primirea cookie-urilor

Pentru a obține un cookie, puteți utiliza o matrice asociativă globală $_COOKIE, de exemplu, $_COOKIE["oraș"] . Așadar, obținem cookie-urile salvate anterior:

Dacă (isset($_COOKIE["oraș") echo "Oraș: " . $_COOKIE[„oraș”] . "
"; if (isset($_COOKIE["limba"])) echo "Limba: " . $_COOKIE["limba"];

Stocarea matricelor în module cookie

Salvarea matricelor în cookie-uri are câteva caracteristici speciale. De exemplu, să salvăm următoarea matrice:

Setcookie("lan", "PHP"); setcookie("lan", "C#"); setcookie("lan", "Java");

Acum îl obținem și îl afișăm pe pagină:

Dacă (isset($_COOKIE["lan"])) (foreach ($_COOKIE["lan"] ca $name => $valoare) ( ​​$name = htmlspecialchars($name); $value = htmlspecialchars($valoare) ); echo „$nume. $valoare
"; } }

Eliminarea cookie-urilor

Pentru a șterge un cookie, trebuie doar să specificați ceva timp din trecut ca dată de expirare:

Setcookie("oraș", "", oră() - 3600);

Continuăm să ne familiarizăm cu principiile fundamentale ale programării web. Astăzi vom vorbi despre așa-numitul cookie-uri(cookie). Cookie-ul sunt date trimise clientului de către serverul web și stocate pe partea clientului.

Orice script web, de exemplu, un script PHP, rulează de obicei într-o fracțiune de secundă, returnând informații către serverul web pentru trimitere ulterioară. După finalizarea scriptului, toate datele create în RAM în timpul funcționării acestuia sunt distruse. Uneori, aceste date nu pot fi pierdute. Să presupunem că pe pagina principală a site-ului există un formular HTML care vă cere să selectați culoarea de fundal preferată. În continuare, toate paginile folosesc culoarea selectată de utilizator. Valoarea culorii este ceva care poate fi stocat în contextul unei sarcini date folosind un cookie.

Pentru a înțelege mai bine funcționarea mecanismului cookie în PHP, trebuie să citiți articolul „Interpretul PHP. Fundamente, principii de funcționare”, în special, care atinge conceptul așa-numitei „prima ieșire”. Deci, puteți utiliza mecanismul în etapa generării unui răspuns HTTP la o solicitare. Pentru a instrui clientul web să salveze un parametru, la răspunsul HTTP este adăugat un antet cu o valoare a formei nume=valoare(numele parametrului, valoarea parametrului), de exemplu:

Set-Cookie: myname=john

Pot exista mai multe astfel de anteturi dacă trebuie stocat mai mult de un parametru. Când primește un răspuns HTTP, browserul web verifică prezența antetelor Set-Cookie și, dacă există, stochează valorile acestora în fișierele sale interne de servicii. Cookie-urile sunt legate implicit de domeniul site-ului. Când pregătește o solicitare HTTP, browserul web verifică dacă a stocat cookie-uri asociate domeniului către care se face cererea. Dacă este prezent, se adaugă un antet la cererea HTTP

Cookie: nume=valoare

pentru fiecare parametru salvat găsit. Astfel, un server web care a instruit un client web să salveze anumiți parametri ca cookie va primi acești parametri înapoi în toate solicitările HTTP ulterioare de la acel client. Când închideți browserul, cookie-urile salvate sunt șterse.

Puteți specifica durata de viață a cookie-ului în cookie. În acest scop, se adaugă un atribut special expiră in felul urmator:

Set-Cookie: nume=valoare; expiră=data

Unde data este data și ora la care browserul ar trebui să șteargă acest cookie, de exemplu:

Acordați atenție formatului atributului expires.

Folosind atributul cale Puteți limita domeniul cookie-urilor. În mod implicit, cookie-urile sunt aplicate tuturor solicitărilor pentru un anumit domeniu, care corespunde valorii cale=/. Dacă, de exemplu, stabilim cale=/doc/, atunci cookie-urile se vor aplica numai solicitărilor către directorul /doc/, precum și tuturor subdirectoarelor și documentelor acestuia, de exemplu, /doc/images/. Exemplu cu atributul cale:

De asemenea, puteți suprascrie legarea de domeniu folosind atributul domeniu. În mod implicit, un cookie este legat de domeniul documentului a cărui solicitare a inițiat crearea cookie-ului. Dacă specificați .domeniu.ru, atunci cookie-ul se va aplica solicitărilor către domeniul domain.ru, precum și tuturor subdomeniilor acestuia. Puteți limita acțiunea la un anumit subdomeniu, de exemplu www.domain.ru. Exemplu de utilizare a atributelor expires, path și domeniu:

Este timpul să vă dați seama cum să lucrați cu cookie-uri în PHP. Pentru a seta cookie-uri, există o funcție PHP setcookie:

Bool (șir $nume [ , șir $valoare [ , int $expire = 0 [ , șir $cale [ , șir $domeniu [ , bool $secure = fals [ , bool $httpdoar = fals ] ] ] ] ] )

Majoritatea parametrilor funcției sunt opționali. Să ne uităm la un exemplu real (pagina propusă anterior cu o alegere a culorii de fundal):

"#090" , "blue" => "#009" , "red" => // Culoare de fundal implicită (alb). Culoarea va fi preluată din cookie dacă există cookie-ul corespunzător (va fi implementat ulterior) ?>
">
Fundal dorit:

În acest exemplu, mecanismul cookie nu a fost încă activat, a fost creat doar cadrul de pagină. Dacă ați citit articole și lecții anterioare, atunci ar trebui să puteți înțelege acest cod. Matricea stochează o listă de culori posibile (puteți adăuga propriile culori), culorile sunt afișate în formă HTML ca o listă derulantă. Acum trebuie să scrieți un handler de date din formular. În mod tradițional, îl plasăm în partea de sus, după declararea datelor:

"#090" , "blue" => "#009" , "red" => "#900" ) ; $bgcolor = "#fff" ; // Culoare de fundal implicită (alb). Culoarea va fi luată din cookie dacă există cookie-ul corespunzător (implementat în exemplul următor) //--Salvați valoarea culorii de fundal într-un cookie. Detalii mai jos în articol } ?>

Handler-ul primește valoarea culorii selectate de utilizator și o stochează într-un cookie folosind funcția setcookie PHP. Funcția setcookie va adăuga un antet Set-Cookie din cookie-ul nostru la răspunsul HTTP generat. Ea, ca și funcția antet, poate fi folosită numai înainte de ieșire, adică cât mai sus posibil în cod.

Grozav, am păstrat prăjiturile. Acum trebuie să le folosim. Deasupra handlerului, adăugați codul pentru obținerea valorii culorii de fundal din cookie, dacă este stocat acolo:

if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $culori ) ) ( $bgcolor = [ "bgcolor" ] ; )

Totul este foarte simplu. Dacă au fost trimise cookie-uri împreună cu cererea de script, PHP le plasează în matricea globală $_COOKIE. Astfel, lucrul cu cookie-uri acceptate nu este diferit de, să zicem, lucrul cu parametrii GET sau POST acceptați. Lista completă a scripturilor:

"#090" , "blue" => "#009" , "red" => "#900" ) ; $bgcolor = "#fff" ; // Culoare de fundal implicită (alb) //--Verificați dacă bgcolor este deja salvat în cookie-uri (verificăm și corectitudinea, deoarece cookie-urile sunt ușor de înlocuit) if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $culori ) ) ( //--Dacă există, utilizați valoarea salvată$bgcolor = [ "bgcolor" ] ; ) //--Verificați dacă parametrul GET bgcolor a fost transmis și dacă este în matricea noastră. În caz contrar, știi, te pot preda cine știe ce, iar apoi va trebui să rezolvăm;) if ( isset ($_GET [ "bgcolor" ] ) && in_array ($_GET [ "bgcolor" ] , $culori ) ) ( $bgcolor = $_GET [ "bgcolor" ] ; //--Acesta va fi noul nostru fundal pentru pagină("bgcolor" , $bgcolor ); ) ?> Posibilitatea de a selecta fundalul paginii
">
Fundal dorit:

Uitați-vă la modul în care funcționează scenariul; dacă aveți întrebări, nu ezitați să comentați. Culoarea de fundal este salvată în așa-numita cookie temporar, care va fi ștearsă când închideți browserul. Să folosim un cookie persistent Pentru a face acest lucru, trebuie să definim un al treilea parametru în funcția setcookie - timpul de ștergere cookie, care va fi convertit în atributul expires al antetului HTTP Set-Cookie. Parametrul specifică un marcaj de timp în format Unix. Cel mai adesea, pentru a genera un astfel de marcaj, se folosește funcția PHP time(), care returnează ora curentă în format Unix, adăugând la aceasta numărul de secunde după care cookie-ul ar trebui șters. De exemplu, timp()+3600- șterge cookie-urile după o oră. Să ne activăm cookie-ul timp de o săptămână:

("bgcolor" , $bgcolor , ora () + 3600 * 24 * 7 ) ; //--Salvați valoarea culorii de fundal într-un cookie

Asta este, acum site-ul „își amintește” culoarea de fundal selectată chiar și după închiderea browserului. Apropo, pentru a șterge cookie-urile, trebuie doar să specificați data trecută ca expirare, de exemplu timp()-3600. Nu uitați să vă uitați la anteturile HTTP atunci când testați exemplele.

Securitatea este o parte importantă a succesului oricărui site web. Cu toate acestea, îmbunătățirea incorect a securității poate duce la creșterea costurilor și la iritarea generală a utilizatorului. În acest ghid, ne vom uita la problemele frecvente întâlnite atunci când lucrați cu fișiere de sesiune și cookie-uri.

Cookie-uri

Cookie-urile sunt modalități de a identifica un utilizator de către un site. De exemplu, site-ul creează un cookie cu numele: „favorite_color” și valoarea: „red”. De acum înainte, de fiecare dată când vizitați site-ul, va fi descărcat un cookie și se va seta ca culoarea dvs. preferată să fie roșie („favorite_color” este „roșu”). Acest lucru este destul de convenabil, deoarece utilizatorul nu trebuie să se înregistreze în sistem de fiecare dată când vizitează site-ul. Această metodă este folosită și în opțiunea „Ține-mă minte”, care se găsește pe multe site-uri. Cu toate acestea, această metodă poate crea și găuri serioase în sistemul de securitate al site-ului.

Un exemplu nu confirmă ce cookie va fi returnat site-ului dvs. După câteva căutări simple, am găsit un site web cu un script pentru panoul de utilizator. Acest script a scos toate informațiile mele de conectare în cookie-uri și a încărcat valorile de fiecare dată când a fost executată acțiunea. De exemplu, dacă aș lăsa un comentariu, sistemul va returna oricare dintre numele mele din variabila nume cookie. Apoi, folosind extensia firebug și alte câteva dispozitive, am putut nu numai să vizualizez aceste fișiere, ci și să le editez. Astfel, ori de câte ori am editat un cookie care conține numele meu, site-ul nu a confirmat corectitudinea numelui, ci a afișat datele. Mi-aș putea schimba și ID-ul. În cele din urmă, am reușit să găsesc ID-ul de administrator (001) și să obțin acces de administrator.

Sesiuni

Sesiunile sunt variabile de identificare a utilizatorului stocate pe serverul dvs. Spre deosebire de cookie-uri, utilizatorii nu le pot schimba direct, dar, în același timp, riscul încă există. Există două amenințări principale la adresa sesiunilor: fixarea sesiunii și deturnarea sesiunii.

Înregistrarea unei sesiuni

Fixarea sesiunii are loc atunci când utilizatorii se conectează la o sesiune deja stabilită și își încarcă informațiile acolo. Conectându-se la o sesiune deja stabilită, un atacator poate vizita această sesiune și poate obține informațiile introduse de utilizatori. Un exemplu simplu este să urmați un link către un site web cu un ID de sesiune deja setat. De exemplu, http://www.example.com/?PHPSESSID=1234. Atacatorul folosește acum același PHPSESSID pentru a vă vedea informațiile.

Deturnarea sesiunii

Deturnarea sesiunii este al doilea tip de atac, împotriva căruia este mult mai greu de apărat. În acest caz, un atacator poate intra în posesia identificatorului dvs. de sesiune prin analiza pachetelor (date) și prin alte metode diferite. De exemplu, un atacator conectat la rețeaua dvs. ar putea filtra toate datele trimise către router. După primirea ID-ului dvs. de sesiune, un atacator poate vizita acest ID pentru a obține acces la toate informațiile dvs.

Utilizarea eficientă a sesiunilor

Acest ghid nu acoperă procesul de codificare a scriptului de înregistrare. Cu toate acestea, voi încerca să vă arăt cum să vă faceți mai sigur scriptul de conectare actual.

În general, utilizarea sesiunilor este mai sigură decât utilizarea cookie-urilor. Acest lucru se datorează faptului că utilizatorii nu pot schimba valorile sesiunii la fel de ușor precum pot schimba valorile cookie-urilor. Acesta este motivul pentru care îmi place să stochez toate variabilele utilizator în variabilele de sesiune. Un alt punct important este să nu aveți încredere niciodată în inputul utilizatorului. Verificați întotdeauna informațiile despre utilizator față de valorile din baza de date MYSQL și apoi trimiteți în sesiune în consecință. Luați în considerare modificarea funcției de înregistrare, cum ar fi următoarele:

funcția de conectare ($nume utilizator, $parolă)
$sql = mysql_query("SELECT id, user_level FROM users WHERE parola = "" . $parola . "" AND username = "" . $username . "" LIMIT 1");
// Dacă nu există potriviri, atunci numele de utilizator și parola nu se potrivesc
if($sql === false)
{
returnează fals;
}
altfel
{
while($u = mysql_fetch_array($sql))
{
session_regenerate_id(true);
$session_id = $u;
$session_username = $nume utilizator;
$session_level = $u;

$_SESSION["user_id"] = $session_id;
$_SESSION["user_level"] = $session_level;
$_SESSION["user_name"] = $session_username;
$_SESSION["user_lastactive"] = timp();
returnează adevărat;
}
}

Să analizăm acest cod. Solicită un nume de utilizator și o parolă și verifică dacă există un utilizator care îndeplinește ambele criterii. Dacă nu există niciun rezultat, este generată o combinație de nume de utilizator/parolă nevalidă și este generată o eroare. În caz contrar, sunt create variabile de sesiune: user_id, user_level, user_name și user_lastactive. Aceste valori sunt completate cu date din lista mysql.

S-ar putea să vă întrebați ce înseamnă funcția „session_regenerate_id(true)”. Mai devreme am vorbit despre fixarea sesiunii. Această soluție este concepută pentru a proteja împotriva acestui tip de atac. Funcția creează un nou ID de sesiune de fiecare dată când utilizatorul se conectează. În acest fel, dacă un utilizator face clic pe un link cu o valoare de sesiune setată, va fi creat un nou ID de sesiune și informațiile despre utilizator vor fi adăugate la noua sesiune și nu la cea veche. Când parametrul corect (adevărat) este trecut prin această funcție, aceasta șterge vechea sesiune și șterge toate informațiile.

Scrierea funcției „Remember Me”.

Cookie-urile sau fișierele de sesiune nu trebuie să conțină parole de utilizator. Acest lucru este foarte important deoarece dacă un fișier de sesiune sau un cookie este interceptat, un atacator poate obține controlul deplin asupra tuturor conturilor. Se știe că mulți utilizatori folosesc aceeași parolă în conturi diferite, iar acest lucru va permite unui atacator să obțină controlul asupra conturilor de utilizator de pe alte site-uri. Cum putem ieși din această problemă?

Soluția la această problemă este cheia de autorizare de acces (auth_key). Cheia de autorizare a accesului poate fi o combinație de nume de utilizator, parolă și un set aleatoriu de caractere, care sunt combinate și criptate. Fiecare utilizator trebuie să aibă propria cheie unică de autorizare de acces. Astfel, atunci când un cookie este setat, valoarea este setată la cheia de autorizare de acces. După aceasta, valoarea cheii de autorizare a accesului este comparată cu valoarea din lista MySQL pe care o adăugați. Să vedem cum se va schimba caracteristica de conectare a utilizatorului.

cont_activ = adevărat; // Verificați dacă utilizatorul dorește ca contul să fie salvat în cookie if($remember) ( // Generați o nouă cheie de autentificare pentru fiecare conectare (deci vechea cheie de autentificare nu poate fi folosită de mai multe ori în cazul // deturnării cookie-urilor) $cookie_auth= rand_string(10) . $nume utilizator; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("UPDATE users SET auth_key = "" . $auth_key . "" WHERE username = "" . $username . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) ) // Atribuiți variabile sesiunii session_regenerate_id(true); $session_id = $u; $session_username = $nume utilizator; $session_level = $u; $_SESSION["user_id"] = $session_id; $_SESSION["user_level"] = $session_level; $_SESSION["user_name"] = $session_username; $_SESSION["user_lastactive"] = timp(); returnează adevărat; ) ) ) ?>

Acum verifică dacă parametrul „adevărat” a trecut prin parametrul de memorare al funcției de conectare. Dacă da, este setat un cookie pentru cheia de autorizare a accesului. Funcția Rand_string creează un șir cu numărul de caractere care au trecut prin el. Funcția Session_encrypt adaugă date arbitrare în lanț și criptează toate informațiile folosind md5. Acest lanț este unic deoarece folosește un nume de utilizator unic pentru fiecare utilizator. Cheia de autorizare a accesului din lista mysql este apoi setată la valoarea introdusă în cookie. Cu toate acestea, această protecție poate să nu fie suficientă pentru site-ul dvs. Luați în considerare adăugarea mai multor chei de autorizare a accesului și mai multe module cookie. Din nou, această funcție nu îndeplinește cerințele funcției „Ține-mă minte”. De asemenea, trebuie să adăugați o funcție de inițializare.

Această funcție trebuie accesată pe fiecare pagină. Scopul său este de a verifica cheia de autorizare a accesului cookie-ului („auth_key”). Dacă cookie-ul folosește funcția isset, va apărea utilizatorul corespunzător. Încă o dată, această funcție trebuie accesată pe fiecare pagină.

Acest cod verifică dacă funcția isset este utilizată. Dacă această funcție este utilizată de un cookie, se va face o verificare pentru a potrivi cheia de autorizare de acces cu utilizatorul. Dacă se realizează o potrivire, fișierul va extrage informațiile necesare și va înregistra utilizatorul. În caz contrar, cookie-ul va fi șters deoarece nu este valid.

Alte funcții

= $currenttime)( // Setați noul utilizator ultima dată activă $_SESSION["user_lastactive"] = $currenttime; ) else ( // Dacă sesiunea a fost inactivă de prea mult timp deconectare deconectare(); ) ) ) ) ?>

Funcția de deconectare se explică de la sine. Această funcție șterge toate variabilele de sesiune și cookie-urile și setează cheia de autorizare de acces a utilizatorului la 0. După aceasta, cheia de autorizare de acces nu mai poate fi utilizată. Trebuie remarcat faptul că un utilizator își poate seta cookie-ul la 0 și poate fi totuși conectat sub numele de utilizator. Pentru a remedia acest lucru, verificați toate informațiile primite de la cookie-uri. Folosind funcția regexp, asigurați-vă că șirul conține un număr valid de caractere, conține caractere valide etc. Funcția keepalive() menține sesiunea vie. Această funcție ar trebui să fie pe fiecare pagină.

Concluzie și deturnarea sesiunii

Este extrem de dificil să te protejezi împotriva deturnării sesiunii. Este posibil să fi citit câteva sfaturi despre utilizarea unei combinații a adresei IP a unui utilizator sau a procesului User Agent pentru a crea etichete de identificare. Cu toate acestea, acest lucru nu este eficient pentru utilizatorii dvs. reali. Adresele IP ale utilizatorilor se schimbă constant. Principalii furnizori de servicii de internet precum AOL le schimbă la fiecare câteva minute. Acest lucru va crea o problemă uriașă. Procesele User Agent se schimbă și ele - IE7 a constatat că agenții utilizator se modifică periodic. Cel mai bun mod de a vă proteja împotriva interceptării este crearea unui sistem de baghete. Acest sistem scoate un cookie pe fiecare pagină de încărcare și, de asemenea, stochează această valoare în lista dvs. mysql. Valoarea cookie-ului este apoi comparată cu valoarea tabelului MySQL. Dacă sunt diferite, sesiunea va fi invalidă.

Acestea sunt funcțiile de bază pentru lucrul cu fișiere de sesiune și cookie-uri. Desigur, pentru a îmbunătăți securitatea, este necesar să adăugați mai multe cookie-uri pentru a verifica validitatea datelor. Acest nivel de protecție nu este suficient pentru a proteja informațiile sensibile, dar trebuie să începi de undeva! Si in concluzie:

Vă rugăm să vă asigurați că valorile cookie-urilor sunt valide.
Nu scoateți niciodată o parolă de sesiune sau o variabilă cookie.

Pentru a preveni fixarea sesiunii, utilizați un identificator
session_regenerate_id.

Până la următoarele lecții!

P.S. Voi traduce comentariile în cod în 24 de ore :)

În tutorialul de astăzi vom vorbi despre lucrul cu cookie-uri în PHP. Să începem cu ce este, de ce este nevoie și de ce a apărut în primul rând.

Pentru ce sunt folosite cookie-urile?

După cum știm deja, în PHP putem lucra cu solicitări GET și POST. Ele ne permit să transmitem date către server pentru a influența cumva funcționarea codului. Putem da scriptului un login și o parolă, le va verifica și ne va permite accesul la orice informație. Totuși, acest lucru nu va permite crearea unei sesiuni între noi și server. Adică, serverul nu poate să ne „amintească” și de fiecare dată când dorim să spunem că suntem noi, va trebui să trimitem o nouă cerere separată cu un login și o parolă.

Cookie-urile au fost inventate ca o soluție. Acestea sunt înregistrări cu un tip cheie-valoare, ca o matrice în PHP, dar sunt stocate în browserul utilizatorului site-ului. Cookie-urile sunt stocate separat pentru fiecare site. De fiecare dată când un utilizator face o solicitare către un site, browserul verifică dacă aceste înregistrări există pentru site-ul respectiv. Și dacă există, atunci le trimite în antetul fiecărei cereri către acest site.

De unde vin cookie-urile?

Cookie-urile sunt create în browser la „cererea” serverului. La un moment dat, decidem că trebuie să creăm un cookie cu o anumită valoare în browserul vizitatorului. Pentru a face acest lucru, serverul trebuie să trimită un antet special în răspunsul către client, care indică ce înregistrare trebuie creată în browser pentru acest site.

Toate acestea se întâmplă în fundal și nu sunt observate de utilizator. Autorizarea pe orice site web funcționează conform acestui principiu. În cel mai simplu caz, după ce ați introdus login-ul și parola pe site, serverul verifică dacă sunt corecte. Și dacă da, atunci serverul poate cere browserului să stocheze aceste date într-un cookie și să le trimită la fiecare solicitare.

Adică, serverul spune aproximativ: „Hei, browser, creează-mi o intrare cu cheia „login” și valoarea „admin”, iar alta cu cheia „parolă” și valoarea „123”. După aceasta, browserul începe să trimită date suplimentare precum:

Autentificare: parola admin: 123

După aceasta, în alte locuri de pe site unde este necesară autorizarea, acum va fi posibilă verificarea acestor date din cookie fără a forța utilizatorul să completeze din nou formularul. Și dacă acestea sunt datele de conectare și parola corecte, atunci dați utilizatorului acces la ceva.

Despre timpul vieții

În același timp, cookie-ul are un TTL (Time To Live). Adică, aceste înregistrări pot fi temporare. Această durată de viață este indicată și de server atunci când cookie-ul este instalat în browser. Datorită acestui lucru, puteți face sesiunea să dureze o jumătate de oră. Și după acest timp, utilizatorul va trebui să se conecteze din nou. Probabil ați observat acest lucru în acțiune pe multe site-uri.

Cum se lucrează cu cookie-uri în PHP

Deci, avem o înțelegere de bază a modului în care funcționează cookie-urile. Să vedem acum cum poți lucra cu ele în PHP.

Să creăm un fișier în proiectul nostru numit viewCookies.php. Să punem următorul cod în el.

După cum ar fi trebuit să ghicești până acum, $_COOKIE este o altă matrice globală în PHP, similară cu matricele $_GETȘi $_POST. Numai că stochează toate cookie-urile care au fost trimise de browser ca parte a solicitării curente.

Să ne uităm la modul în care funcționează acest script, deschizând pagina în browser: http://myproject.loc/viewCookies.php

După cum putem vedea, această matrice este în prezent goală. Să-l umplem :) Pentru a face acest lucru, trebuie să instalăm un fel de cookie în browser. În PHP, funcția este folosită pentru aceasta setcookie($nume, $valoare, $ttl, $cale)

Parametrii trecuți:

  • $name – nume cookie
  • $value – valoarea sa
  • $ttl – toată viața. Dacă specificați 0, cookie-ul va fi instalat pentru totdeauna (până când este șters).
  • $cale – cale în bara de adrese. Dacă specificați „/”, cookie-urile vor fi disponibile din toate directoarele de pe site. De exemplu, atât în ​​http://myproject.loc/ cât și în http://myproject.loc/posts/ . Dacă setați „/posts/”, cookie-urile vor fi accesibile numai din directorul http://myproject.loc/posts/ și din toate subdirectoarele acestuia (de exemplu, http://myproject.loc/posts/new/). Valoarea implicită este directorul curent în care este instalat cookie-ul. Dacă dorim ca cookie-ul să fie disponibil pe tot site-ul, atunci trebuie să setăm această valoare la „/”.

Mai sunt câțiva parametri, puteți citi despre ei în documentația oficială.

Acum să încercăm această funcție în acțiune. Să creăm un fișier numit setCookies.php și să scriem următorul cod în el:

După aceea, accesați http://myproject.loc/setCookies.php, unde vom vedea o pagină goală. După cum am spus deja, lucrul cu cookie-uri nu este vizibil pentru utilizator.

Cu toate acestea, această lucrare poate fi întotdeauna văzută în consola pentru dezvoltatori Google Chrome. Să o deschidem (apăsând F12), să mergem la fila Rețea, să reîmprospătăm pagina în browser și să o găsim în lista de date descărcate (este singura de acolo).

Faceți clic pe această intrare și în fereastra care se deschide în dreapta, selectați fila Anteturi. Aici, în secțiunea Antete de răspuns, putem vedea antetul Set-Cookie cu datele pe care le-am specificat.

Astfel, cookie-urile au fost instalate cu succes în browser. Să mergem acum la pagina noastră care afișează matricea $_COOKIE - http://myproject.loc/viewCookies.php

După cum putem vedea, cookie-urile instalate anterior în browser sunt acum trimise către server. De asemenea, le puteți vedea în solicitare uitându-vă la secțiunea Anteturi de solicitare din consola pentru dezvoltatori.

Dacă trebuie să vedeți toate modulele cookie care sunt disponibile în browser pentru un anumit site, le puteți vizualiza în aceeași consolă pentru dezvoltatori Google Chrome. Pentru a face acest lucru, accesați fila Aplicație, selectați elementul Cookie-uri din lista din stânga și site-ul nostru în interiorul acestuia.

Toate cookie-urile vor fi prezentate într-o listă convenabilă.

Ce mai trebuie să știți despre cookie-uri

Și pentru a încheia această lecție, trebuie să adăugăm că cookie-urile sunt setate folosind un antet în răspunsul serverului prin HTTP. Protocolul HTTP este conceput în așa fel încât antetul trebuie să fie întotdeauna înaintea datelor și nimic altceva. Prin urmare, funcția setcookie și orice alte funcții din PHP care schimbă antetul în răspunsul HTTP trebuie apelate înainte ca orice ieșire să fie scoasă.

Puteți seta mai întâi cookie-ul și apoi afișa textul.

Totul va merge grozav.

Dar nu puteți imprima textul (care este corpul răspunsului HTTP) și apoi încercați să setați cookie-ul.

După cum putem vedea, acest lucru va duce la o eroare. Acesta este modul în care funcționează protocolul HTTP. Mai întâi - titlul, apoi - corpul. Doar așa și nu altfel.

Setarea mai multor cookie-uri

Nu este nimic mai ușor decât să setați câteva cookie-uri. Pentru a face acest lucru, trebuie doar să apelați funcția setcookie de mai multe ori.

Acestea vor fi transferate cu succes clientului.

Vom analiza un exemplu de interacțiune completă a utilizatorului prin cookie-uri în lecția următoare. Între timp, să ne facem temele.