<?> PHP NOVA invictum.hr
Izdanje 2026.
Poglavlje 30

Korisnici i autentikacija

Registriramo i prijavljujemo korisnika bez spremanja lozinke, štitimo sesiju i uvodimo oporavak računa bez otkrivanja podataka.

31 min čitanja Napredno razina PHP 8.5 ciljna verzija

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.

Hashiranje i provjera
<?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ć.

Uspješna prijava
<?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.

Reset token
<?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.

  1. E-mail učinite jedinstvenim u bazi.
  2. Lozinku hashirajte i nikada je ne vraćajte iz repozitorija gdje nije potrebna.
  3. Regenerirajte sesiju nakon prijave i potpuno je uklonite pri odjavi.

Za provjeru i nastavak

Službeni izvori