Nakon ovog poglavlja
Što ćete znati napraviti
- Povezati label, input, name i poruku pogreške.
- Obraditi GET i POST formu te primijeniti PRG uzorak.
- Dodati CSRF token za zahtjeve koji mijenjaju stanje.
Upotrebljiv unos
Svako polje treba ime i oznaku
Atribut name određuje ključ koji PHP prima. label povezan atributom for omogućuje veću klikabilnu površinu i pomaže čitačima zaslona. Placeholder nije zamjena za label jer nestaje tijekom tipkanja.
HTML atributi required, type i minlength poboljšavaju iskustvo, ali nisu sigurnosna provjera. Napadač može poslati zahtjev bez forme pa poslužitelj sve ponovno validira.
<form method="post" action="/kontakt">
<label for="email">E-mail adresa</label>
<input
id="email"
name="email"
type="email"
autocomplete="email"
required
>
<button type="submit">Pošalji</button>
</form>
Jedan zahtjev, jedan rezultat
Post/Redirect/Get sprječava ponovno slanje
Kod POST zahtjeva najprije provjeravamo CSRF, zatim normaliziramo i validiramo podatke. Ako postoje pogreške, ponovno prikažemo formu s unesenim vrijednostima. Nakon uspješnog spremanja šaljemo 303 preusmjeravanje na GET stranicu.
PRG uzorak sprječava da osvježavanje preglednika ponovi spremanje. Poruku o uspjehu možemo privremeno spremiti u sesiju kao flash podatak.
<?php
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {
// provjera tokena, validacija i spremanje
header('Location: /kontakt/hvala', true, 303);
exit;
}
Zahtjev mora biti namjeran
CSRF token veže formu uz korisničku sesiju
Napadačka stranica može pokušati poslati formu prema aplikaciji u kojoj je žrtva prijavljena. Nasumični token spremamo u sesiju, šaljemo kao skriveno polje i na POST-u uspoređujemo hash_equals funkcijom.
<?php
$_SESSION['csrf'] ??= bin2hex(random_bytes(32));
$sent = (string) ($_POST['_token'] ?? '');
if (!hash_equals($_SESSION['csrf'], $sent)) {
http_response_code(419);
exit('Sesija forme je istekla.');
}
Primijenite naučeno
Vježba: Kontakt forma
Napravite formu za ime, e-mail i poruku koja čuva unos nakon pogreške.
- Dodajte povezane labele i autocomplete gdje ima smisla.
- Na serveru provjerite CSRF i sva polja.
- Nakon uspjeha primijenite 303 preusmjeravanje.
Za provjeru i nastavak