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

HTML forme

Gradimo pristupačne forme koje čuvaju korisnikov unos, jasno prikazuju pogreške i sigurno šalju podatke PHP-u.

24 min čitanja Srednje razina PHP 8.5 ciljna verzija

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.

Pristupačno polje
<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.

Post/Redirect/Get
<?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.

Provjera CSRF tokena
<?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.

  1. Dodajte povezane labele i autocomplete gdje ima smisla.
  2. Na serveru provjerite CSRF i sva polja.
  3. Nakon uspjeha primijenite 303 preusmjeravanje.

Za provjeru i nastavak

Službeni izvori