IPRO - PC Magazine Romania, Aprilie 2004
SOLUȚII PENTRU PROGRAMATORII ȘI DESIGNERII WEB
Securitatea aplicațiilor Web
Mircea Scărlătescu
Nu mai sunt prea mulți cititori de ziare sau telespectatori care să nu fi aflat
de viruși, despre atacuri asupra paginilor web, asupra calculatoarelor și alți
astfel de termeni care se vehiculează în presa noastră, nu întodeauna în cunoștință
de cauză.
Atacurile informatice reprezintă un subiect la modă peste tot, și împreună
cu spamul probabil că oferă o sursă bună de venituri companiilor care se ocupă
cu soluții de securizare infromatică.
Vei găsi sute de cărți, unele de calitate îndoielnică despre securitatea siturilor
web, și cum să vă transformați situl într-unul aproape imposibil de spart sunt
însă destul de triste: situl 100% securizat nu există. Pentru că întodeauna
se va găsi cineva care să știe o portiță de evitare a vreunei politici de securitate.
Ceea ce poți face însă este să încerci să reduci riscul de a fi afectat, aplicând
o serie de strategii care deși sunt simple, sunt ignorate de cei ce construiesc
un sit, și de cei care-l administreaza ulterior.
Ceea ce vei citi în cele ce urmează reprezintă o serie de sfaturi utile și
la obiect, fiind aplicabile pentru majoritatea siturilor prezente online la
această oră.
O primă regulă nescrisă a securității web este să nu ai niciodată
încredere în utilizatorii sitului tău. Și asta pentru că dacă 90% din cei ce
intră pe un sit, o fac pentru a afla câte ceva nou, sau pentru a găsi materiale
interesante pentru ei, rămân 10% care îți poate da o durere serioasă de cap
J. Sunt acei vizitatori care încearcă să descopere diferite vulnerabilități
ale sistemului, începând cu găsirea de parole și spargerea de conturi ale utilizatorilor
"cinstiți" și până la distrugerea sitului (blocarea acestuia, alterarea
informațiilor de pe sit, sau copierea bazei de date, dacă aceasta prezintă interes).
Interacțiunea cu utilizatorii capătă prin prisma celor de mai sus o importanță
deosebită. Astfel, orice formular în care un user își introduce date, sau poate
stoca în baza de date informații trebuie să fie bine procesat, din punctul de
vedere al conținutului. Este nerecomandabil să accepți pe un sit ca un utilizator
să încarce cod HTML sau JavaScript. Un utilizator rău intenționat poate încerca
să încarce cod care ulterior accesat poate să blocheze diferite secțiuni ale
sitului, sau mai rău, să transmită informații către locații unde nu ar trebui
să ajungă. De asemenea, dacă baza de date nu acceptă valori nule în înregistrările
sale, trebuie să verifici ca datele introduse corespund acestei cerințe. Datele
care au un format specific, cum ar fi date calendaristice, ore, coduri poștale,
adrese de e-mail trebuie să fie validate pentru a corespunde unor formate standard.
Validarea din acest punct de vedere se va face cu ușurință utilizând JavaScript.
O greșeală frecventă care trebuie evitată este reprezentată
de utilizarea altor extensii în numele fișierelor, în afara celor recunoscute
de server. Să dăm un mic exemplu. Dacă într-o aplicație web dorim să introducem
un fișier care să conțină date de gen parole de conectare la baza de date, sau
alt tip de constante, atunci foarte mulți programatori vor face greșeala de
a redenumi acel fișier și a-I asigna o extensie de gen inc, txt, con sau alte
denumiri de acest gen. Surpriza neplăcută pe care o vor avea este că dacă serverul
web nu recunoaște tipul fisierului, atunci îl va trata ca și fișier text, și-l
va afișa ca atare. Astfel, date critice ale aplicației vor fi disponibile pentru
oricine. Această greșeală poate fi uneori fatală pentru aplicații care folosesc
baze de date. Compromiterea bazei de date reprezintă pentru un sit dinamic imposibilitatea
de a mai funcționa corect. Pe lângă funcționalitățile care se pierd, datele
pot fi exploatate de către o persoană rău-voitoare, iar pagubele în acest caz
se pot mări considerabil.
Un alt exemplu de cod nesecurizat, mult prea întâlnit pe siturile
românești este reprezentat de includerea de nume de fișiere sau de date confidențiale
în transferul datelor din formulare prin metoda GET. Fără a intra în detalii
trebuie să spunem că metoda GET concatenează la URL-ul scriptului de prelucrare
a datelor și conținutul formularului apelant. Spre exemplu putem întâlni un
apel după cum urmează:
http://www.site.ro/login.php? user=user2004&parola=pcmagazine.
Nu e nevoie să mai insistăm asupra consecințelor pe care o astfel de metodă
o poate avea asupra securității unui sit. Conturile de acces pot fi compromise
extrem de ușor, un browser cu opținea de "history" putând să rețină
extrem de multe parole în acest mod. Accesul la fișiere ce nu sunt accesibile
utilizatorilor (și nici nu e cazul să fie) poate fi înlesnit de implementări
de genul:
http://www.site.ro/display php?file=pcmagazine.html
Așadar, utlizarea metodei GET pentru transmiterea datelor din formulare trebuie
să fie facută cu mult discernământ.
Pentru că în exemplul de mai sus avem parte de "clasicul" deja tandem
username - parolă, trebuie să mai facem o precizare despre acest sistem de autentificare.
Dacă stocarea acestui tip de date se face în baze de date, așa cum se întâmplă
în majoritatea cazurilor, atunci mare atenție trebuie să fie acordată modalității
de interogare a bazei de date la autentificare. Un programator (nu foarte valoros)
vă poate spune că e ușor să realizezi un program scurt care să încerce să afle
o parolă folosind un "dicționar", adică un fișier care conține foarte
multe cuvinte, iar metoda de găsire este reprezentată de "ghicirea"
parolei (se testează rând pe rând fiecare cuvânt din dicționar). O protecție
pe cât de simplă pe atât de eficientă este reprezentată de numărul limitat de
încercări de autentificare în sistem. Astfel, după 3 încercări nereușite de
autentificare, sistemul poate să afișeze direct mesaj de eroare, fără a mai
verifica dacă parola este corectă. Astfel, pentru a putea să se autentifice,
un user trebuie să reinițializeze sesiunea, prin închiderea ferestrei browserului.
Un program care încearcă să fure o parolă nu poate realiza acest lucru prea
ușor, deci problema este eliminată. Poate vă întrebați de ce accesăm baza de
date de doar trei ori… răspunsul este că numărul 3 pare să se fi impus
în acest tip de scripturi de autentificare. Sistemul s-a extins și la autentificarea
SIM-urilor pentru telefoanele mobile. Desigur, puteți să înlocuiți numărul de
încercări cu orice valoare dorită, chiar și 1.
Exemplele de mai sus sunt desigur doar elemente menite să pună bazele în securizarea
unui site. Munca depusă poate să fie destul de anevoioasă, și este posibil să
descoperi că multe module ale aplicației nu corespund cererilor din ziua de
azi în ceea ce privește securitatea. Dar dacă am reușit să te facem să te gândești
cel puțin 5 minute la cât de important este să realizezi situri calitative din
punctul de vedere al securității, atunci vizitează situri precum www.securityfocus.com
unde tehnicile de protecție sunt explicate mult mai pe larg, și nu numai pentru
aplicații web.
Mult succes!
|