Nakon ovog poglavlja
Što ćete znati napraviti
- Spremiti lozinku pomoću password_hash i provjeriti je password_verify funkcijom.
- Upravljati sigurnom autentikacijskom sesijom.
- Dizajnirati vremenski ograničen jednokratan reset lozinke.
Lozinku ne možemo vratiti
Sprema se adaptivni hash
password_hash automatski stvara salt i zapisuje parametre u rezultat. PASSWORD_DEFAULT dopušta PHP-u da koristi preporučeni algoritam, pa stupac ostavljamo dovoljno dugim. password_verify provjerava pokušaj bez ručnog uspoređivanja.
password_needs_rehash omogućuje tiho osvježavanje parametara nakon uspješne prijave. Lozinke ne šifriramo reverzibilno i ne šaljemo ih u log.
<?php
$hash = password_hash($password, PASSWORD_DEFAULT);
if (!password_verify($attempt, $user['password_hash'])) {
throw new AuthenticationFailed();
}
if (password_needs_rehash($user['password_hash'], PASSWORD_DEFAULT)) {
$users->replacePasswordHash($user['id'], password_hash($attempt, PASSWORD_DEFAULT));
}
Novi sigurnosni kontekst
Regenerirajte identifikator nakon prijave
Poruka ne smije otkriti postoji li e-mail; „Podaci za prijavu nisu ispravni“ pokriva oba slučaja. Ograničite broj pokušaja po računu i izvoru, uvedite progresivno čekanje te zabilježite neuobičajene obrasce.
Nakon uspješne provjere pozivamo session_regenerate_id(true) i u sesiju spremamo minimalan identifikator korisnika. Odjava briše poslužiteljsku sesiju i kolačić.
<?php
session_regenerate_id(true);
$_SESSION['user_id'] = $user['id'];
$_SESSION['authenticated_at'] = time();
Oporavak je dio autentikacije
Jednokratni token s kratkim rokom
Reset token generiramo kriptografski, korisniku šaljemo sirovu vrijednost, a u bazi čuvamo samo hash i vrijeme isteka. Nakon uporabe token odmah poništavamo i prekidamo druge osjetljive sesije prema politici.
Višefaktorska autentikacija snažno smanjuje štetu ukradene lozinke. Za administratore je preporučljiva passkey/WebAuthn ili TOTP podrška uz sigurne recovery kodove.
<?php
$token = bin2hex(random_bytes(32));
$tokenHash = hash('sha256', $token);
$expiresAt = new DateTimeImmutable('+30 minutes');
Primijenite naučeno
Vježba: Sigurna prijava
Dodajte registraciju, prijavu i odjavu postojećoj CRUD aplikaciji.
- E-mail učinite jedinstvenim u bazi.
- Lozinku hashirajte i nikada je ne vraćajte iz repozitorija gdje nije potrebna.
- Regenerirajte sesiju nakon prijave i potpuno je uklonite pri odjavi.
Za provjeru i nastavak