Každý php developer ví, že ošetřit vstupní pole formulářů je nutnost. Vždy existuje riziko napadení (např. skrze SQL injection), ale také riziko zanesení nevhodných znaků nebo sekvencí znaků. I jen obyčejný apostrof se stává bez ošetření zkázonosným. Jak tedy data filtrovat?Často používám filtrování přes SESSIONS. Data z formuláře bývají většinou předávána v poli POST, přičemž je běžně zapotřebí nejprve je před odesláním někam dočasně uložit. Zejména vícestránkové formuláře to vyžadují (nepracujete-li se skrytým html kódem pomocí jQuery).
Následující ukázka kódu může filtrovat na pár řádcích v podstatě libovolně velké pole dat.
Funkce str_replace zde nahrazuje apostrof escape sekvencí ' , která při vkládání do databáze (nebo i do sessions) již nemůže dělat žádné problémy (narozdíl od apostrofu, který by bylo nutné uvést se zpětným lomítkem, což ale nebývá zrovna ideální řešení).
1 2 3 4 5 |
<?php foreach($_POST as $k=>$v) { $v = str_replace("'", "'", $v); //html escape jednoduchých uvozovek (apostrofu) $_SESSION['post'][$k]=$v; } |
$k = key
$v = value
Do smyčky lze zařadit další filtry. Jedinou nevýhodou tohoto postupu může být to, že filtruje všechna data. Pokud byste například u jednoho vstupního pole chtěli aplikovat jiný filtr, ale u ostatních by byl nežádoucí, potom nelze tuto techniku jednoduše použít. Navíc u velmi velkých formulářů to způsobí určité prodlení, které může uživatel vnímat jako pobídku k dalšímu kliknutí na tlačítko pro odeslání formuláře.
Funkce pro filtrování vstupních dat
znak | čím je nahrazen |
& (ampersand) | & |
„ (dvojitá uvozovka) | " |
‚ (jednoduchá uvozovka) | ' |
< (less than) | < |
> (greater than) | > |
Přidává před uvozovky zpětné lomítko \ . (Stejně tak se používá pro přidání zpětného lomítka chceme-li uložit samotné zpětné lomítko.) Při pozdější práci s daty je zapotřebí tato lomítka zase odstranit, proto je často lepší nahrazovat uvozovky s funkcí
1 |
$v = str_replace("'", "'", $v); |
Odstraní z řetězce všechny html a php tagy.
1 |
$v = strip_tags( trim( $v ) ); |
Funkce trim() je zde pro odstranění nevhodných znaků ze začátku a konce řetězce. Těmito znaky bývají mezera, tabelátor, \n, \r a \0.