Utilizarea de sesiuni PHP 9
- Invatati sa creati sesiuni in PHP
- Invatati sa lucrati cu variabile din sesiuni si sa stergeti datele sesiunii
1. Despre sesiuni, crearea unei sesiuni PHP
Sesiunea reprezinta o modalitate prin care PHP retine informatii de la o pagina la alta.
Odata cu initializarea unei sesiuni, utilizatorul poate pastra anumite variabile chiar daca in continuare viziteaza si alte pagini ale site-ului. In principiu informatia se pastreaza pana la inchiderea browser-ului, sau pana cand utilizatorul distruge in mod intentionat sesiunea curenta.
Lucrurile se desfasoara ca in felul urmator: in momentul cand un user s-a logat la site, PHP atribuie acestuia un identificator unic de sesiune : SID. Acest SID este inglobat intr-un coockie cu numele PHPSESSID si trimis apoi catre browserul utilizatorului. Daca browserul nu suporta cookie-uri sau acestea sunt dezactivate, atunci acest SID este adaugat la adresa URL. In acelasi timp se creeaza pe server un fisier cu numele SID. In continuare daca utilizatorul doreste sa stocheze anumite informatii, acestea vor fi practic scrise in acest fisier SID de pe server.
Sesiunile au urmatoarele avantaje:
- – Pot fi folosite chiar daca browserul utilizatorului nu suporta cookie-uri sau daca acestea sunt dezactivate.
- – Permit stocarea unui volum mare de informatii, spre deosebire de cookie-uri care sunt limitate in aceasta privinta.
- – Sunt mai sigure in raport cu cookie-urile deoarece informatiile nu sunt transmise in mod repetat intre client si server.
Initializarea unei sesiuni se face cu functia :
- session_start()
Aceasta trebuie sa fie printre primele linii de cod dintr-un script PHP, deoarece apelul acestei functii trebuie facut inainte de trimiterii catre browser-ul Web a vreunui cod HTML sau chiar a unui spatiu vid.
Daca folosim stocarea iesirii in buffer, instructiunea session_start() nu trebuie inserata neaparat la inceputul codului.
Instructiunea session_start() nu este necesare daca in fisierul de configurare „php.ini”, variabila „session.auto_start” are valoarea TRUE.
Pentru a intelege mai bine modul de lucru cu sesiuni si functia session_start(), folosim un exemplu in care avem o pagina principala „a.php” unde cream o variabila cu numele „userName”, atribuindu-i valoarea „CursPHP”, pe care o stocam intr-o sesiune PHP, pagina contine o legatura catre o alta pagina „b.php”, aceasta din urma va folosi functia session_start() pentru a prelua, prin sesiune, valoarea variabilei „user_name” din pagina „a.php”, astfel putem folosi valoarea acestei variabile intr-un script din pagina „b.php”.
Continutul fisierului „a.php” este urmatorul:
<?php
//Fisierul a.php
session_start();
if(!isset($_SESSION[‘userName’]))
$_SESSION[‘userName’] = „CursPHP”;
?>
<!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>
Continutul fisierului „b.php” este urmatorul:
<?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>
Observati ca atribuirea, respectiv citirea variabilelor se face folosind variabila super-globala : _SESSION.
Deschizand prima pagina, „a.php”, va fi afisat urmatorul rezultat
Aceasta este pagina „a.php”
Variabila de sesiune are valoarea: CursPHP
Legatura spre pagina b.php
Cand apasam click pe link-ul „spre pagina b.php”, se va deschide aceasta pagina, afisand urmatorul continut:
Aceasta este pagina „b.php”
Variabila de sesiune are valoarea: CursPHP
– In acest exemplu se observa ca pagina „b.php” detine informatii despre variabila de sesiune creata in pagina „a.php”.
2. Manipularea variabilelor sesiunii.
In anumite momente ar putea fi util sa aflam identificatorul sesiunii curente. Pentru aceasta folosim functia session_id(), ca in exemplul urmator:
<?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() accepta un parametru. Astfel putem seta un anumit SID pentru sesiunea curenta. In acest caz trebuie sa apelam functia session_id() inainte de functia : session_start(), ca in exemplul urmator:
<?php
session_id(‘123abc’);
session_start();
echo „<br /> Identificatorul sesiunii curente SID = „. session_id();
//Va afisa rezultatul: „Identificatorul sesiunii curente SID = 123abc”
?>
Deoarece variabilele de sesiune pot fi citite de alti utilizatori neautorizati, nu este indicat sa pastram aici informatii esentiale cum sint parolele.
Pentru a creea un minimum de securitate putem codifica aceste informatii, folosind functtile de codare oferite de PHP:
- md5() sau crypt()
– Functia md5(sir_de_caractere) codifica sirul de caractere furnizat ca parametru si returneaza un sir de 32 charactere hexazecimale. Aceasta functie foloseste algoritmul de criptare: „RSA Data Security, Inc. MD5 Message-Digest Algorithm„.
Iata un exemplu de utilizare al acestei codificari:
<?php
$user = „CursPHP”;
$codificat = md5($user);
echo „<br /> user codificat = $codificat”;
// Va afisa: „user codificat = 0a460e3d95526f05a0064154ad94a378”
?>
Consideram cazul in care avem o variabila de sesiune „$parola” care pastreaza o parola si dorim sa codificam si sa transmitem acrasta variabila astfel incat utilizatorii neautorizati sa nu o poata folosi. Pentru aceasta folosim functia md5(), pentru a o cripta. Mai mult initializam o variabila globala cu numele „$secret”, careia ii atribuim ca valoare un sir de caractere oarecare. In continuare, inainte de a introduce parola intr-o sesiune PHP, concatenam valorile „$secret” si „$parola” si criptam rezultatul. Astfel, chiar daca cineva reuseste sa decripteze variabila de sesiune, este putin probabil sa poata separa sirul „$secret” creat de noi.
Este bine sa pastram acest fisier intr-un director pretejat, cum ar fi cu un nivel mai sus decat directorul pentru pagini de Web.
Iata cum se prezinta exemplul prezentat mai sus. (consideram o variabila „$passtest” care verifica daca valoarea acesteia este egala 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
$passtest=’ mypass’;
if (md5($secret. $passtest) == $_SESSION[‘parola’])
echo „Parola acceptata”;
else
echo „Parola nu este valida”;
?>
Astfel, daca valoarea variabilei „$passtest”, care poate fi obtinuta de exemplu dintr-un formular HTML, este identica cu parola pastrata de noi, va fi afisat mesajul „Parola acceptata”.
3. Stergerea unei sesiuni
Pentru a putea sterge o sesiune este necesar sa incepem scriptul PHP cu instructiunea: session_start(), ca intotdeauna cand folosim sesiuni.
Pentru a sterge toate variabilele memorate in matricea $_SESSION folosim:
- unset($_SESSION);
Pentru a sterge doar o variabila memorata in sesiune folosim :
- unset($_SESSION[‘nume_variabila’]);
Datele sesiunii sunt memorate in server in fisiere temporare. Pentru a sterge datele sesiunii din server folositi:
- session_destroy()
Iata un exemplu care ilustreaza aceasta procedura:
<?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”;
?>
Optiuni pentru utilizarea caracterelor speciale
- Invatati rolul optiunilor „magic_quotes”
- Invatati sa convertiti caracterele speciale prin schimbarea semnificatiei acestora utilizand functii PHP
- Invatati sa convertiti caracterele speciale specifice HTML si cele din sirurile folosite pentru adrese URL
1. Ghilimelele magice
Apar situatii cand dorim sa introducem ghilimele in interiorul unui textintr-o baza de date, dar SQL nu permite înglobarea unor ghilimele simple în interiorul valorii unui sir. Probleme similare pot aparea la introducerea unui text ce contine caractere speciale precum: \ + * ? ^ ( $ ), si care sunt trimise la un script PHP.
PHP include functii si facilitati pentru rezolvarea acestor situatii.
Fisierul de initializare PHP („php.ini”) contine optiuni de configurare care determina modul în care PHP controleaza datele provenite de la o sursa externa, cum sunt un formular HTML, un fisier text sau o baza de date.
Optiunea magic_quotes_gpc specifica modul în care PHP manipuleaza operatiile HTTP: GET si POST, precum si operatiile dintre PHP si MySQL sau cele cu variabile cookie. Daca optiunea este activata (ON), PHP prefixeaza automat ghilimelele simple, ghilimelele duble, caracterele backslash si caracterele nule (caracterele a caror valoare ASCII este 0) care apar într-o variabila HTTP, cu un caracter backslash (\).
Optiunea magic_quotes_runtime specifica modul în care PHP manipuleaza datele de origine externa. Daca aceasta optiune este activata, PHP ignora automat ghilimelele simple si duble care apar în datele externe, inclusiv datele din formularele HTML, din fisiere si baze de date.
Daca este activata optiunea magic_quotes_sybase, aceasta modifica efectul optiunilor magic_quotes_gpc si magic_quotes_runtime, astfel încât un caracter de tip ghilimele simple sa fie prefixat cu un alt caracter de tip ghilimele simple, nu cu un backslas.
Dar, în general, accesul la aceste comenzi din fisierul „php.ini” il are administratorul de sistem iar utilizatorii obisnuiti nu trebuie sa aiba posibilitatea de a aduce modificari în fisier. Astfel, pot fi folosite functii PHP care sa seteze aceste optiuni pe durata scriptului respectiv.
Functiile get_magic_quotes_gpc() si get_magic_quotes_runtime() returneaza fiecare valoarea optiunii PHP corespunzatoare setate in fisierul „php.ini”. Mai mult, puteti folosi functia set_magic_quotes_runtime() pentru a specifica valoarea optiunii magic_quotes_runtime pentru restul duratei scriptului PHP curent.
De exemplu, pentru a dezactiva optiunea magic_quotes_runtime, invocati functia
- set_magic_quotes_runtime(0);
Alternativ, pentru a activa aceasta optiune intr-un script, folositi functia
- set_magic_quotes_runtime(1);
2. Conversia caracterelor speciale si anularea acesteia
PHP poate converti ghilimelele simple si duble dintr-un sir, folosind functia addslashes().
Daca PHP nu este configurat astfel încât sa converteasca aceste caractere din sir în mod automat, atunci trebuie sa executati manual aceasta modificare. Pur si simplu utilizati functia addslashes(), transferându-i ca argument sirul text. Aceasta adauga caracterul backslash „\” pentru conversia caracterelor de tip ghilimele simple, ghilimele duble, backslash si caractere nule
Aceasta conversie nu trebuie confundata cu o alta, si anume conversia de tip, care foloseste caracterul backslash (\).
Conversia mentionata în acest capitol consta din modificarea semnificatiei anumitor caractere, pentru a preveni o interpretare eronata a acestora de catre programele specializate, precum MySQL. Din acest motiv, toate conversiile mentionate în acest capitol fac referire la modificarea semnificatiei unor caractere, nu la conversiile de tip.
De exemplu, pentru a converti continutul sirului „$text” si a plasa rezultatul în variabila „$modificat”, invocati functia dupa cum urmeaza:
- $modificat = addslashes($text);
Functia stripslashes() executa operatia complementara de anulare a conversiei, elimina caracterele backslash inserate.
Pentru a anula conversia sirului „$modificat” si a plasa rezultatul în variabila „$nemodificat”, utilizati functia dupa cum urmeaza:
- $nemodificat = stripslashes($modificat)
O alta functi utila pentru conversia caracterelor speciale este quotemeta(), aceasta va insera un backslash înainte de fiecare aparitie a urmatoarelor caractere: . \ + * ? [ ^ ] ( $ ). Ca si addslashes(), functia quotemeta() se foloseste in mod similar, prelund ca argument sirul text.
3. Conversia textelor HTML
Când lucrati cu texte HTML, conversia executata de functia addslashes() nu este suficienta, deoarece HTML este sensibil si la alte caractere speciale decât cele convertite de functia addslashes().
In schimb puteti folosi functia htmlspecialchars().
Aceasta converteste caracterele la care HTML este sensibil. Functie este utila cand se doreste ca un anumit sir sa nu contina marcaje HTML, ceea ce poate fi important in modul de operare a unei aplicatii, cum ar fi un tabel HTML.
Functia are urmatoarea forma:
- htmlspecialchars(„text” [,stil_ghilimele])
Unde „text” specifica sirul care contine textul ce urmeaza a fi convertit, iar argumentul optional „stil_ghilimele” specifica modul de conversie a ghilimelelor simple, respectiv duble. Valorile permise ale optiunii „stil_ghilimele” sunt:
- ENT_COMPAT – precizeaza ca trebuie convertite numai ghilimelele duble
- ENT_QUOTES – precizeaza ca trebuie convertite ambele tipuri de ghilimele
- ENT_NOQUOTES – precizeaza ca nu trebuie convertit nici un tip de ghilimele
De exemplu, pentru a converti toate caracterele HTML speciale, inclusiv ambele tipuri de ghilimele, din sirul „$texthtml”, utilizati functia dupa cum urmeaza:
- $conversie = htmlspecialchars($texthtml);
Functia htmlspecialchars() executa urmatoarele conversii:
Caracter | Rezultatul conversiei |
& (ampersand) | & |
„(ghilimele duble) | " (numait când este specificată opţiunea ENT_COMPAT sau ENT_QUOTES) |
‘(ghilimele simple) | ' (numai când este specificată opţiunea ENT_QUOTES) |
< (mai mic decât) | < |
> (mai mare decât) | > |
O functie PHP conexa, htmlentities(), converteste toate caracterele cu echivalente în entitati HTML. Este acceptat setul de caractere ISO-8859-1
Si o alta functie utila pentru conversia textelor HTML este functia n12br(). Aceasta insereaza tag-ul <br /> anterior fiecarui caracter de tip linie noua care se gaseste in argumentul sau.
4. Conversia pentru adresele URL
Când doriti sa codificati in PHP date ca parte a unei adrese URL, puteti folosi functia urlencode().
Aceasta functie înlocuieste fiecare caracter non-alfanumeric (cu exceptia spatiilor) cu un simbol al procentului (%), urmat de doua cifre hexazecimale care contin valoarea ASCII a caracterului. Spatiile sunt codificate sub forma de simboluri ale adunarii (+).
O functie conexa, în speta rawurlencode(), executa o conversie similara; cu deosebirea ca înlocuieste spatiile cu %20, conform RFC 1738, standardul Internet pentru codificarea adreselor URL.
Functiile urldecode() si rawurldecode() executa operatii complementare. Aceste functii sunt utile la crearea adreselor URL care includ perechi ‘nume-valoare’.
De exemplu, sa presupunem ca avem un script PHP care trebuie sa creeze o pagina HTML ce contine o hiperlegatura spre adresa URL a unui motor de cautare. Termenul de cautare trebuie transmis în forma codificata URL, pentru ca serverul Web si browserul sa nu se „impiedice” de caracterele speciale. Pentru a codifica datele pentru o adresa URL, puteti folosi o metoda ca in exemplul urmator:
- echo ’<a href=”www.sitecautare.com?cuvantcheie=’. urlencode($text). ‘”>’;
Ca sa intelegeti mai bine aceste moduri de conversie, puteti studia amanuntit exemplul urmator:
<?php
// Variabila $a contine textul ca va fi convertit
$a = „abc 123 ‘ <br /> / < & > ( % ) * , $ . # ^ ! [ \ ] { @ } : ; = ?”;
$b = addslashes($a);
$c = stripslashes($b);
$d = quotemeta($a);
$e = htmlentities($a);
$f = urlencode($a);
echo ‘<br /> Conversie addslashes() = ‘. $b;
echo ‘<br /> Anulare conversie addslashes() = ‘. $c;
echo ‘<br /> Conversie quotemeta($a) = ‘. $d;
echo ‘<br /> Conversie caractere HTML = ‘. $e;
echo ‘<br /> Conversie pt. adrese URL = ‘. $f;
?>
Datele de iesire ale exemplului sunt urmatoarele:
Conversie addslashes() = abc 123 \’ / < & > ( % ) * , $ . # ^ ! [ \\ ] { @ } : ; = ?
Anulare conversie addslashes() = abc 123 ‘ / < & > ( % ) * , $ . # ^ ! [ \ ] { @ } : ; = ?
Conversie quotemeta($a) = abc 123 ‘ / < & > \( % \) \* , \$ \. # \^ ! \[ \\ \] { @ } : ; = \?
Conversie caractere HTML = abc 123 ‘ <br /> / < & > ( % ) * , $ . # ^ ! [ \ ] { @ } : ; = ?
Conversie pt. adrese URL = abc+123+%27+%3Cbr+%2F%3E+%2F+%3C+%26+%3E+%28+%25+%29+
%2A+%2C+%24+.+%23+%5E+%21+%5B+%5C+%5D+%7B+%40+%7D+%3A+%3B+%3D+%3F