Utilizarea de sesiuni PHP • •
Învăţaţi să creaţi sesiuni în PHP Învăţaţi să lucraţi cu variabile din sesiuni şi să ştergeţi datele sesiunii
1. Despre sesiuni, crearea unei sesiuni PHP Sesiunea reprezintă o modalitate prin care PHP reţine informaţii de la o pagină la alta. Odată cu iniţializarea unei sesiuni, utilizatorul poate păstra anumite variabile chiar dacă în continuare vizitează şi alte pagini ale site-ului. În principiu informaţia se păstrează până la închiderea browser-ului, sau până când utilizatorul distruge în mod intenţionat sesiunea curentă. Sesiunea durează cât dorim noi, dacă dăm parametrul opţional expires care determină când se încheie automat sesiunea. Lucrurile se desfăşoară cam în felul următor: în momentul când un user s-a logat la site, PHP atribuie acestuia un identificator unic de sesiune : SID. Acest SID este înglobat într-un cookie cu numele PHPSESSID şi trimis apoi către browserul utilizatorului. Dacă browserul nu suportă cookie-uri sau acestea sunt dezactivate, atunci acest SID este adăugat la adresa URL. În acelaşi timp se creează pe server un fişier cu numele SID. În continuare dacă utilizatorul doreşte să stocheze anumite informaţii, acestea vor fi practic scrise în acest fişier SID de pe server. Sesiunile au următoarele avantaje: • • •
Pot fi folosite chiar dacă browserul utilizatorului nu suportă cookie-uri sau daca acestea sunt dezactivate. Permit stocarea unui volum mare de informaţii, spre deosebire de cookie-uri care sunt limitate în această privinţă. Sunt mai sigure în raport cu cookie-urile deoarece informaţiile nu sunt transmise în mod repetat între client şi server.
Iniţializarea unei sesiuni se face cu funcţia : •
session_start()
Aceasta trebuie să fie printre primele linii de cod dintr-un script PHP, deoarece apelul acestei funcţii trebuie făcut înaintea trimiterii către browser-ul Web a vreunui cod HTML sau chiar a unui spaţiu vid. Dacă folosim stocarea ieşirii în buffer, instrucţiunea session_start() nu trebuie inserată neapărat la începutul codului. Instrucţiunea session_start() nu este necesară dacă în fişierul de configurare "php.ini", variabila "session.auto_start" are valoarea TRUE. Pentru a înţelege mai bine modul de lucru cu sesiuni şi funcţia session_start(), folosim un exemplu în care avem o pagină principală "a.php" unde creem o variabilă cu numele "userName", atribuindu-i valoarea "dvs", pe care o stocăm într-o sesiune PHP, pagina conţine o legatură către o altă pagină "b.php", aceasta din urmă va folosi funcţia session_start() pentru a prelua, prin sesiune, valoarea variabilei "user_name" din pagina "a.php", astfel putem folosi valoarea acestei variabile într-un script din pagina "b.php". Continutul fisierului "a.php" este următorul: <?php //Fisierul a.php session_start(); if(!isset($_SESSION['userName'])) $_SESSION['userName'] = "dvs"; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> Aceasta este pagina "a.php" <?php echo "<br />Variabila de sesiune are valoarea: ". $_SESSION['userName']; ?> <br />Legatura <a href="b.php">spre pagina b.php</a> </body> </html>
Conţinutul fişierului "b.php" este următorul: <?php //Fisierul b.php session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Pagina b.php</title> </head> <body> Aceasta este pagina b.php <?php echo "<br />Variabila de sesiune are valoarea: ". $_SESSION['userName']; ?> </body> </html> Observaţi că atribuirea, respectiv citirea variabilelor se face folosind variabila super-globală : _SESSION. Deschizând prima pagina, "a.php", va fi afişat următorul rezultat: Aceasta este pagina "a.php" Variabila de sesiune are valoarea: dvs Legatura spre pagina b.php Când apăsăm click pe link-ul "spre pagina b.php", se va deschide această pagină, afişând următorul conţinut: Aceasta este pagina "b.php" Variabila de sesiune are valoarea: dvs În acest exemplu se observa că pagina "b.php" deţine informaţii despre variabila de sesiune creată în pagina "a.php". 2. Manipularea variabilelor sesiunii În anumite momente ar putea fi util să aflăm identificatorul sesiunii curente. Pentru aceasta folosim funcţia session_id(), ca în exemplul următor: <?php echo "<br /> Identificatorul sesiunii curente SID este:". session_id(); //Va afisa un rezultat asemanator cu: "Identificatorul sesiunii curente SID este:2846240682abf24a09f42664fc03bbf3" ?> Functia session_id() acceptă un parametru. Astfel putem seta un anumit SID pentru sesiunea curentă. În acest caz trebuie sa apelăm functia session_id() înainte de funcţia : session_start(), ca în exemplul următor: <?php session_id('123abc'); session_start(); echo "<br /> Identificatorul sesiunii curente SID = ". session_id(); //Va afişa rezultatul: "Identificatorul sesiunii curente SID = 123abc" ?> Deoarece variabilele de sesiune pot fi citite de alţi utilizatori neautorizaţi, nu este indicat să păstrăm aici informaţii esenţiale cum sunt parolele. Pentru a crea un minimum de securitate putem codifica aceste informaţii, folosind funcţile de codare oferite de PHP: •
md5() sau crypt()
- Functia md5(sir_de_caractere) codifică şirul de caractere furnizat ca parametru şi returnează un şir de 32 charactere hexazecimale. Această funcţie foloseşte algoritmul de criptare: "RSA Data Security, Inc. MD5 Message-Digest Algorithm".
Iată un exemplu de utilizare al acestei codificări: <?php $user = "balonas"; $codificat = md5($user); echo "<br /> user codificat = $codificat"; // Va afisa: "user codificat = 65b9367821521900da1a88a828fe2a76 " ?> Considerăm cazul în care avem o variabilă de sesiune "$parola" care păstrează o parolă şi dorim să codificăm şi să transmitem această variabilă astfel încât utilizatorii neautorizaţi să nu o poată folosi. Pentru aceasta folosim funcţia md5(), pentru a o cripta. Mai mult iniţializăm o variabilă globală cu numele "$secret", căreia îi atribuim ca valoare un şir de caractere oarecare. În continuare, înainte de a introduce parola într-o sesiune PHP, concatenăm valorile "$secret" şi "$parola" şi criptăm rezultatul. Astfel, chiar dacă cineva reuşeşte să decripteze variabila de sesiune, este puţin probabil să poata separa sirul "$secret" creat de noi. Este bine să păstrăm acest fişier într-un director pretejat, cum ar fi cu un nivel mai sus decât directorul pentru pagini de Web. Iată cum se prezintă exemplul prezentat mai sus. (considerăm o variabila "$passtest" care verifică dacă valoarea acesteia este egală cu parola): <?php $secret = 'abcgfd43599oopjhfdxcaqq30pmnvcx'; $parola = 'mypass'; $cod = md5($secret. $parola); session_start(); $_SESSION['parola'] = $cod; // Consideram variabila "$passtest" pentru a testa daca valoarea acesteia este egala cu parola if (md5($secret. $passtest) == $_SESSION['parola']) echo "Parola acceptata"; else echo "Parola nu este valida"; ?> Astfel, dacă valoarea variabilei "$passtest", care poate fi obţinută de exemplu dintr-un formular HTML, este identică cu parola păstrată de noi, va fi afişat mesajul "Parola acceptata". 3. Ştergerea unei sesiuni Pentru a putea şterge o sesiune este necesar să începem scriptul PHP cu instrucţiunea: session_start(), ca întotdeauna când folosim sesiuni. Pentru a şterge toate variabilele memorate în matricea $_SESSION folosim: •
unset($_SESSION);
Pentru a sterge doar o variabilă memorată în sesiune folosim : •
unset($_SESSION['nume_variabila']);
Datele sesiunii sunt memorate în server în fişiere temporare. Pentru a şterge datele sesiunii din server folosiţi: •
session_destroy()
Iată un exemplu care ilustrează această procedură: <?php // Initializeaza datele sesiunii session_start(); // Sterge tabloul $_SESSION unset($_SESSION); // Sterge datele de sesiune din server session_destroy();echo "<br /> Sesiunea curenta a fost inchisa"; ?>