Ověření formuláře PHP
Tato a další kapitoly ukazují, jak používat PHP k ověřování dat formuláře.
Ověření formuláře PHP
Myslete na BEZPEČNOST při zpracování formulářů PHP!
Tyto stránky ukážou, jak zpracovávat formuláře PHP s ohledem na bezpečnost. Správné ověření dat formuláře je důležité pro ochranu formuláře před hackery a spammery!
HTML formulář, se kterým budeme v těchto kapitolách pracovat, obsahuje různá vstupní pole: povinná a volitelná textová pole, přepínače a tlačítko pro odeslání:
Pravidla ověření výše uvedeného formuláře jsou následující:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
Nejprve se podíváme na prostý HTML kód formuláře:
Textová pole
Pole jména, e-mailu a webu jsou prvky pro zadávání textu a pole komentáře je textová oblast. HTML kód vypadá takto:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
Přepínače
Pole pohlaví jsou přepínače a kód HTML vypadá takto:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
Prvek formuláře
HTML kód formuláře vypadá takto:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Po odeslání formuláře jsou data formuláře odeslána s method="post".
Co je to proměnná $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] je super globální proměnná, která vrací název souboru aktuálně spouštěného skriptu.
$_SERVER["PHP_SELF"] tedy odešle odeslaná data formuláře na stránku samotnou, místo aby přeskakoval na jinou stránku. Tímto způsobem se uživateli zobrazí chybové zprávy na stejné stránce jako formulář.
Co je funkce htmlspecialchars()?
Funkce htmlspecialchars() převádí speciální znaky na entity HTML. To znamená, že nahradí znaky HTML jako < a > znakem < a >. To brání útočníkům ve zneužití kódu vkládáním kódu HTML nebo Javascript (útoky Cross-site Scripting) do formulářů.
Velká poznámka o zabezpečení formulářů PHP
Proměnná $_SERVER["PHP_SELF"] může být použita hackery!
Pokud je na vaší stránce použito PHP_SELF, může uživatel zadat lomítko (/) a poté provést některé příkazy Cross Site Scripting (XSS).
Cross-site scripting (XSS) je typ chyby zabezpečení počítače, který se obvykle vyskytuje ve webových aplikacích. XSS umožňuje útočníkům vkládat skripty na straně klienta do webových stránek prohlížených ostatními uživateli.
Předpokládejme, že na stránce s názvem „test_form.php“ máme následující formulář:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Pokud nyní uživatel zadá do adresního řádku normální adresu URL, například „http://www.example.com/test_form.php“, výše uvedený kód bude přeložen na:
<form method="post" action="test_form.php">
Zatím je vše dobré.
Mějte však na paměti, že uživatel zadá do adresního řádku následující adresu URL:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
V tomto případě bude výše uvedený kód přeložen do:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Tento kód přidá značku skriptu a výstražný příkaz. A když se stránka načte, spustí se kód JavaScript (uživatel uvidí pole s upozorněním). Toto je jen jednoduchý a neškodný příklad, jak lze využít proměnnou PHP_SELF.
Uvědomte si, že do tagu <script> lze přidat jakýkoli kód JavaScript! Hacker může uživatele přesměrovat do souboru na jiném serveru a tento soubor může obsahovat škodlivý kód, který může změnit globální proměnné nebo odeslat formulář na jinou adresu, například za účelem uložení uživatelských dat.
Jak se vyhnout zneužívání $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] exploitům se lze vyhnout použitím funkce htmlspecialchars().
Kód formuláře by měl vypadat takto:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Funkce htmlspecialchars() převádí speciální znaky na entity HTML. Pokud se nyní uživatel pokusí zneužít proměnnou PHP_SELF, výsledkem bude následující výstup:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Pokus o zneužití selže a nezpůsobí žádnou škodu!
Ověřte data formuláře pomocí PHP
První věc, kterou uděláme, je předat všechny proměnné funkcí PHP htmlspecialchars().
Když použijeme funkci htmlspecialchars(); pokud se pak uživatel pokusí odeslat do textového pole následující:
<script>location.href('http://www.hacked.com')</script>
- toto by se neprovedlo, protože by se to uložilo jako kód HTML escape, takto:
<script>location.href('http://www.hacked.com')</script>
Kód lze nyní bezpečně zobrazit na stránce nebo v e-mailu.
Když uživatel odešle formulář, uděláme také další dvě věci:
- Odstraňte nepotřebné znaky (mezera, tabulátor, nový řádek) ze vstupních dat uživatele (pomocí funkce PHP trim())
- Odstraňte zpětná lomítka (\) ze vstupních dat uživatele (pomocí funkce PHP stripslashes())
Dalším krokem je vytvoření funkce, která za nás provede veškerou kontrolu (což je mnohem pohodlnější než psát stále stejný kód).
Funkci pojmenujeme test_input().
Nyní můžeme zkontrolovat každou proměnnou $_POST pomocí funkce test_input() a skript vypadá takto:
Příklad
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
Všimněte si, že na začátku skriptu zkontrolujeme, zda byl formulář odeslán pomocí $_SERVER["REQUEST_METHOD"]. Pokud je REQUEST_METHOD POST, pak byl formulář odeslán – a měl by být ověřen. Pokud nebyl odeslán, přeskočte ověření a zobrazte prázdný formulář.
Ve výše uvedeném příkladu jsou však všechna vstupní pole nepovinná. Skript funguje dobře, i když uživatel nezadává žádná data.
Dalším krokem je nastavit vstupní pole jako povinná a v případě potřeby vytvořit chybové zprávy.