Sistem de logare securizat

La o primă vedere pare “sigur”, dar securitatea ține de mai multe chestii și e foarte relativă.

Codul e destul de greu de urmărit (sunt 5 nivele de indentare acolo), dar logica pare OK.

Subliniez “pare”, pentru că nu poate zice nimeni că totul e OK judecând după porțiunea de cod pe care ai expus-o tu. Poate să fie alte chestii în afara codul prezentat care să aibă probleme de securitate.

Exemple:

  • Nu știm sigur dacă Redirect_to() conține exit și dacă nu conține, ce se mai execută după codul prezentat de tine.
  • O problemă ce ține de configurația serverului: unde se salvează sesiunile.
    Default cred că PHP e configurat să creeze fișiere în ceva folder. Dacă cineva are acess la folderul respectiv se poate să fure sesiuni. Asta iar, presupunând că PHP e configurat default să pună sessionId-ul în cookie pe care fiecare poate să-l rescrie în browser.
  • Stocarea datelor: când vine vorba de securitate, trebuie să te gândești la ce se întâmplă dacă cineva are acess la baza de date. Folosind md5 simplu e foarte simplu de ghicit parola cuiva dacă-i găsești hash-ul. Asta pentru că md5-ul e foarte vechi și există deja precalculate “rainbow tables” care să-ți zică ce parolă îți dă un anumit hash (nu e nepărat parola userului, dar poate fi folosită pentru login). Pentru asta trebuie să folosești algoritmi mai noi cum a sugerat @iamntz sau măcar să folosești un salt unic pentru fiecare utilizator.
  • Folosești https sau nu? Fără https cineva poate să vadă parola trimisă ca text către server doar fiind în aceiași rețea cu utilizatorul. Cel mai simplu e să folosești https. Dacă vrei să te complici și să faci secure pe http atunci implementează ceva ca aici: Steam's login method is kinda interesting
  • Există protecție împotriva unui “Brute-force_attack”? În care cineva încearcă să ghicească parola unui user.
  • Există protecție împotriva unei sesiuni furate? Dacă cineva are acess la sesiunea unui utilizator, poate să o refolosească? Asta de obicei se rezolvă destul de greu făcând verificări de genul IP (nu e relevant dacă vrei să meargă și pe mobil site-ul), user-agent (browser-ul), țara de unde IP-ul și unde a fost autentificat ultima oară sau implementând Multi factor authentication.
  • Cross-site request forgery

Pentru asta cel mai simplu ar fi să salvezi sesiunile într-o tabelă în baza de date.
Standardul în industrie momentan e să setezi un cookie pentru utilizator cu un sessionId. Important să fie ceva hash unic și nu un număr pe care-l incrementezi tu că atunci cineva poate să-și genereze singur cookie-ul și fure sesiunile altora. Pentru fiecare pagină care are cookie-ul respectiv setat să încarci sesiunea și datele din tabela respectivă.

După ce faci asta o să fie ușor să revoci sesiuni sau să le ștergi, să faci backup etc…

Concluzia
Teoretic codul tău e ok, dar practic sunt foarte multe lucruri pe care le poți îmbunătăți și sunt multe lucruri care n-au treabă cu codul care să cauzeze probleme de securitate.

În funcție de proiect (cât de importantă e securitatea) și de bugetul (timp/bani) pe care-l ai la dispoziție decizi cât de în detaliu vrei să mergi cu chestiile astea. E greu sau chiar imposibil să faci ceva 100% sigur. Tot timpul o să fie scăpări. Ce poți decide în schimb e cât de departe vrei să mergi. Cât de important este securitatea pentru proiect (de obicei iei în calcul ce se poate întâmpla dacă ceva merge rău și cât de mult ai de suferit comparat cu cât trebuie să investești).

Dacă vrei, putem discuta în detaliu fiecare topic de mai sus.

5 Likes