Sistem (destul de) sigur de înregistrare-autentificare cu menţinere logare

Pentru a crea un sistem securizat de înregistrare-autentificare folosindu-ne de simbioza PHP/MySQL cu opțiunea de „menține-mă logat”, vom folosi MySQLi pentru interacțiunile cu baza de date și tehnici de securitate precum utilizarea hash al parolelor și cookie-uri securizate pentru opțiunea de „menține-mă logat”.

Configurarea bazei de date

În vederea testării vom crea un tabel pentru utilizatori care să stocheze informațiile necesare: ID, nume de utilizator, parola (hashuită) și token-ul pentru „Reţine-mă”.

Înregistrare

Vom folosi password_hash() pentru a securiza parola înainte de stocarea ei în baza de date.

Autentificare

Atunci când ne logăm vom avea de ales dacă să bifăm opţiunea „Reţine-mă”. Astfel, dacă este bifată această opţiune, va fi generat un token securizat pe care îl stocăm în baza de date și în cookie-uri.

Verificarea autentificării prin sesiune sau cookie-uri

La fiecare accesare a paginii (de ex., index.php), verificăm dacă utilizatorul este autentificat fie prin sesiune, fie prin cookie-urile „reţine-mă”.

Dacă dorim să avem un fişier de autorizare, ce va fi inclus în fiecare fişier care necesită autentificare, putem adapta codul de mai sus(1).

Astfel, în paginile unde dorim să avem această verificare a autentificării, vom include fişierul.

Aşadar, prin fişierul de autorizare a autentificării:

  1. Sesiunea este verificată prima: Dacă utilizatorul este deja autentificat, evităm interacțiuni suplimentare, inclusiv verificarea cookie-urilor, ceea ce limitează suprafața de atac.
  2. Cookie-ul „reţine-mă” este o soluție de backup: Dacă nu există o sesiune, verificăm cookie-ul, dar doar dacă există un token valid asociat în baza de date. Dacă token-ul nu este valid, cookie-ul este șters.
  3. Reînnoirea sesiunii după autentificare cu cookie: Dacă autentificarea prin cookie este reușită, se creează o sesiune nouă, deci se revine la un mecanism de securitate mai robust.

  1. Pe lângă micile diferenţe între cele două pagini (mesaje nenecesare la pagina de autorizare), am alternat cuplul store_result() - fetch() cu get_result() - fetch_assoc(), diferind modul de extragere a datelor, dar şi cum ne raportăm la numărarea înregistrărilor.
    Diferența dintre store_result() și get_result():
    store_result() este necesar atunci când utilizăm metodele de legare (bind_result()), care îți permit să extragi rezultatele direct din interogarea pregătită. Această metodă trebuie folosită dacă intenționăm să lucrăm cu bind_result().
    get_result() funcționează doar dacă serverul MySQL este configurat să utilizeze drivere native pentru MySQLi (mysqlnd), dar este folosit de obicei pentru a prelua un set de rezultate sub formă de obiect. Acesta poate returna un mysqli_result care oferă metode precum fetch_assoc().
    • După utilizarea metodei get_result(), numărul de rânduri din este accesat din obiectul rezultat ($result), nu din $stmt. Metoda num_rows nu este disponibilă pe $stmt când folosesim get_result().

Author: Ovidiu.S

Suficient de pasionat de această zonă profesională ca, în cazul în care ştiu ceva - cât de puţin - să împărtăşesc cu alţii.

Leave a Reply