Úloha 6: Práce s webovými formuláři v PHP
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 funkcinl2br()(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 atributselected. - Přepínače (
<input type="radio">): Skupina prvků se stejnýmname, z nichž lze vybrat právě jeden. Pro zachování volby doplňujeme atributchecked. - 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<,>.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
GETaPOST? Kdy je vhodné použítGET(např. vyhledávání, filtrování) a kdyPOST(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žijteisset()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