Úloha 6: Práce s webovými formuláři v PHP

Začátečník $_POST input / select / radio / checkbox XSS bezpečnost nl2br()

Cíl úlohy

Formuláře jsou základním způsobem, jakým webové aplikace získávají data od uživatelů. Cílem této úlohy je vytvořit skript, který zpracuje všechny běžné typy formulářových prvků (textové pole, heslo, víceřádkový text, výběrovou roletku, přepínače a zaškrtávací pole), bezpečně data ošetří proti útokům typu XSS a po odeslání zachová vyplněný stav.

Typy formulářových prvků a jejich zpracování v PHP

  • Text a heslo (<input type="text">, <input type="password">): Přenáší jednoduchý textový řetězec. V PHP jej načtete přes $_POST['nazev'].
  • Víceřádkový text (<textarea>): Uživatel může odřádkovat pomocí klávesy Enter. V HTML se nový řádek nezobrazí jako zalomení, pokud nepoužijete funkci nl2br() (New Line to BR).
  • Výběrová roletka (<select>): Odesílá hodnotu vybraného <option value="...">. Pro zachování vybrané volby po odeslání doplňujeme atribut selected.
  • Přepínače (<input type="radio">): Skupina prvků se stejným name, z nichž lze vybrat právě jeden. Pro zachování volby doplňujeme atribut checked.
  • Zaškrtávací pole s více volbami (<input type="checkbox" name="predmet[]">): Pokud chceme umožnit výběr více položek najednou, přidáme do názvu hranaté závorky []. PHP pak v $_POST['predmet'] vytvoří pole vybraných hodnot.

Bezpečnost: Ochrana proti XSS (Cross-Site Scripting)

Nikdy nevěřte uživatelskému vstupu! Kdyby uživatel do formuláře zadal např. <script>alert('Hack')</script> a vy jste kód vypsali přímo pomocí echo $_POST['text'];, prohlížeč by skript vykonal.

Vždy použijte:

  • htmlspecialchars($vstup, ENT_QUOTES, 'UTF-8') – převede nebezpečné znaky jako <, > a " na bezpečné HTML entity &lt;, &gt;.
  • strip_tags($vstup) – odstraní veškeré HTML a PHP tagy z řetězce.

Doplňující otázky k zamyšlení a náměty na rozšíření

  • 1. Jaký je rozdíl mezi metodou GET a POST? Kdy je vhodné použít GET (např. vyhledávání, filtrování) a kdy POST (přihlašování, odesílání zpráv)?
  • 2. Co se stane, když uživatel ve formuláři nezaškrtne žádný checkbox? Bude proměnná $_POST['predmet'] vůbec existovat? (Nápověda: použijte isset() nebo operátor ?? []).
  • 3. Jak funguje validace formulářů přímo na straně klienta v HTML5 (atributy required, minlength, pattern)? Nahrazuje klientská validace nutnost kontroly v PHP? (Proč ne?).
  • 4. Zkuste formulář doplnit o kontrolu e-mailové adresy pomocí vestavěné PHP funkce filter_var($email, FILTER_VALIDATE_EMAIL).

Vyzkoušejte funkční řešení: Otevřít vzorovou úlohu formulare.php