Posts Tagged securitate
PROTECTIA OUTPUT-ULUI
Posted by admin in Php tutorial on February 10, 2010
Protectia output-ului se refera la datele care parasesc aplicatia PHP, cu destinatia browser, baza de date etc.
Continutul HTML pe care un script PHP il trimite catre un browser se poate compune din informatii statice (cod HTML deja scris) si informatii dinamice – de.exemplu, date extrase dintr-o tabela SQL, sau informatii provenite sub forma de input de la utilizator. Programatorul trebuie sa se asigure ca datele preluate din surse externe si trimise catre browser nu contin nimic daunator pentru securitatea utilizatorului.
Exemplu: un site dispune de o pagina in care utilizatorii pot introduce sugestii, cu ajutorul unei componente de tip textarea. Sugestiile ultimului utilizator sunt afisate si ele in aceeasi pagina. Input-ul este stocat intr-o baza de date si extras prin intermediul unei interogari – iata fragmentul de cod relevant:
$rez = mysql_query(“SELECT sugestie FROM sugestii ORDER BY sugestie DESC LIMIT 1″);
$rez = mysql_retcn_row($rez);
echo “Comentariul precedent:<br />”;
echo $rez[0];
Daca un utilizator introduce in textarea un comentariu care contine cod HTML:
Site-ul dvs este <b><u>plictisitor</u></b>, va rog impuscati designerul.
mesajul va fi stocat ca atare in baza de date, iar codul de mai sus il va trimite nemodificat catre browser; urmarea va fi formatarea unei portiuni de cod asa cum doreste utilizatorul.
Acesta este doar inceputul; un utilizator cu o imaginatie mai bogata ar putea incerca sa introduca un mesaj publicitar ce contine un link, iar unul rauvoitor ar putea folosi urmatoarea secventa:
<script language= “javascript”>
document, locations ‘http://www. site-rauvoitor. com’
</script>
Daca aceasta “sugestie”, odata stocata in baza de date, este trimisa ca atare catre browserele altor utilizatori, acestia vor fi redirectionati catre www.site-rauvoitor.com, aflat sub controlul atacatorului, care ar putea sa le fure cookie-uri, sa le planteze virusi etc.
Problema in scenariul de mai sus era faptul ca anumite combinatii de caractere sunt interpretate ca elemente de control ale limbajului HTML in loc sa fie afisate ca atare in browser (spre exemplu, < si > sunt interpretate ca delimitatoare de tag). Pentru ca aceste caractere sa fie afisate ca atare, fara a li se lua in seama semnificatia speciala, este necesara reprezentarea lor intr-un alt fel – si anume sub forma asa-numitelor entitati HTML: < devine < iar > devine > . Procedeul este asemanator cu secventele escape de la string: atunci cand aveam nevoie sa includem caracterul” in interiorul unui string delimitat tot cu “, il reprezentam diferit, folosind secventa \” .
PHP ofera doua perechi de functii care se ocupa de escaping-ul (reprezentarea speciala) a caracterelor cu statut aparte:
• string htmlspecialchars ( string $string [, int $quote_stylel) - transforma caracterele &, <, >,'," din
$string in entitatile HTML corespunzatoare. Al doilea argument controleaza modul de transformare
pentru ghilimele si apostroafe - iata valorile posibile:
o ENT_COMPAT - transforma numai ghilimelele si lasa neatinse apostroafele
o ENT_QUOTES - transforma atat ghilimelele cat si apostroafele
o ENT_NOQUOTES - nu transforma nici ghilimelele nici apostroafele
Functia care realizeaza translatia inversa este htmlspecialchars_decode().
• string htmlentities ( string $string [, int $quote_style [, string $charset]) – functioneaza pe acelasi
principiu ca si htmlspecialchars(), insa transforma in entitati HTML toate caracterele care au o entitate
corespunzatoare. Argumentul quote_style are acelasi efect ca in cazul lui htmlspecialchars().
Functia pentru translatia inversa este html_entity_decode().
Exemplu: in scenariul prezentat anterior, la citirea ultimei sugestii din baza de date si afisarea ei pe ecran, avem grija sa transformam caracterele speciale in entitati HTML:
$rez = mysql_query(“SELECT sugestie FROM sugestii ORDER BY sugestie DESC LIMIT 1″); $rez = mysql_fetch_row($rez);
$rez = html special chars($rez[0]);
echo “Comentariul precedent:<br />”;
echo $rez;
Nota: atunci cand stim ca anumite date vorfi destinate exclusiv afisarii pe ecran, putem aplica htmlspecialchars()/htmlentities() inaintea stocarii lor in baza de date, ele putandfi apoi extrase si afisate ca atare. Daca insa utilizarea lor vafi una mixta, este mai sigur ca transformarea sa sefaca doar inainte de afisare, iar informatiile sa stea in baza de date nealterate.
Datele trimise catre serverul de baze de date
Comenzile transmise catre baza de date contin deseori informatie provenita din variabile, inclusiv input provenit de la utilizator. Aceste informatii pot contine caractere care au regim special pentru baza de date in cauza. Spre exemplu, caracterul ‘ (apostrof) este folosit in SQL pentru delimitarea valorilor de tip string sau date.
Sa ne imaginam ca avem o tabela SQL numita Edituri in care dorim sa introducem date provenite dintr-un formular HTML. Codul care realizeaza acest lucru ar putea arata astfel:
$editura = $_POST['nume_editura'];
$sql= “INSERT INTO Edituri(Nume) VALUES(‘$editura’)”;
$r = mysq1_query($sql);
Atunci cand utilizatorul introduce in formular editura O’Reilly, interogarea $sql devine:
INSERT INTO Edituri(Nume) VALUES (‘O’Reilly”);
Apostroful din O’Reilly il va inchide pe eel ce semnalizeaza inceputul valorii, iar interogarea – care acum contine o eroare de sintaxa – va esua. O astfel de vulnerabilitate poate fi folosita de un atacator iscusit in scopuri mult mai rele decat esecul unei operatiuni de insert.
Ca si in cazul afisarii datelor in browser, caracterele cu regim special pentru serverul de baze de date destinatie trebuie reprezentate diferit, astfel incat ele sa nu fie interpretate de catre baza de date ca si caractere speciale. Vorbim tot de o modalitate de escaping, insa care actioneaza asupra altui set de caractere si este influentata de alte setari.
Exista mai multe variante de a realiza reprezentarea corecta a caracterelor speciale in comenzile trimise catre baza de date:
• folosirea functiei PHP addslashes() pentru adaugarea unui caracter escape (\) inaintea caracterelor
speciale
• facilitatea de magic quotes a PHP, activabila din fisierul de configurare php.ini
• folosirea functiilor de escaping puse la dispozitie de catre extensia corespunzatoare bazei de date
folosite
• folosirea de prepared statements
PHP ofera programatorului urmatoarele functii predefinite:
string addslashes ( string $str) – adauga caracterul escape \ in fata fiecarui caracter ” (ghilimele),’ (apostrof), \ (backslash) sau NUL (valoarea 0).
• string stripslashes ( string $str ) – elimina caracterele escape introduse de addslashes()
Functii de escaping ale extensiei PHP pentru lucrul cu baza de date
Desi reprezinta o masura de siguranta buna pentru inceput, deseori addslashes() nu este suficient, deoarece diferitele softuri de baze de date folosesc felurite caractere speciale pe care addslashes() nu le transforma. Extensiile PHP pentru lucrul cu baze de date ofera fiecare functii sau metode pentru transformarea unui sir de caractere astfel incat el sa nu contina caractere SQL speciale. lata cateva exemple de astfel de functii:
- string mysql_real_escape_string ( string $string [, resource $link_identifier]) – adauga caracterul scape \ in fata caracterelor NUL (codul 0), \n, \r, \,’,” si EOF (end-of-file – codul 26) gasite in $string, returnand rezultatul transformarii. Functia este introdusa de extensia mysql•string mysqli_real_escape_string ( mysqli $link, string $escapestr ) – idem, dar introdusa de extensia mysqli
Exemplu: inserarea datelor de la utilizator in baza de date:
$editura = mysql_real_escape_string($_POST['nume_editura']);
$sql = “INSERT INTO Edituri(Nume) VALUES(‘$editura’)”;
$r = mysql_query($sql) ;

