Pokud jste někdy programovali webovou stránku v PHP a obsluhovali zasílání nějakého formuláře, potom jste s velkou pravděpodobností chtěli docílit toho, aby onen formulář obsluhoval tutéž stránku. Jinými slovy, aby se obsah formuláře pomocí vhodné metody zasílal na tutéž stránku a podle globálních konstant se pomocí logiky programu rozhodlo jak dál (vypsat chybu, pokračovat dál, vykreslit formulář, a podobně). Na to je vhodné používat například funkci array_key_exists, případně testovat ještě nějakou unikátní skrytou odeslanou hodnotu. Ale to je už jiná věc, než kterou se chci v tomto článku zabývat.
Velmi často se programátoři spoléhají na užitečnou funkci PHP_SELF. K té můžeme přistupovat pomocí superglobálního pole SERVER takto: $_SERVER[‚PHP_SELF‘] . Podle starého zápisu to šlo i přes $PHP_SELF. Jednoduchý formulář pro odeslání hodnoty pomocí formuláře té samé stránce, ze které odesíláme, je v následující ukázce:
<!--?php echo ' <form action="' . $_SERVER['PHP_SELF'] . '" method="POST"-->'; echo ' <input type="hidden" name="hodnota" value="hodnota" /> '; echo ' <input type="submit" value="Odešli" /> '; echo ' '; ?> |
Jenže použití PHP_SELF je z hlediska bezpečnosti velmi nebezpečné. Lze jej velmi jednoduše obejít sebejednodušším XSS útokem. XSS (Cross-site scripting) je druh útoku, kdy útočník podstrčí svůj kód na stránku s neošetřenými vstupy. Tím dokáže změnit vzhled či chování stránky. Úplně stačí, když útočník zadá do URL vyhledávače:
stranka.php/” |
Tohle je ukázka XSS útoku
Můžete si vyzkoušet, co se s danou stránkou nazvanou stranka.php stane. A buďte si jisti, že můžete vložit jakýkoliv kus kódu, ať už HTML, CSS nebo i JavaScript.
Co tedy s tím? Je třeba vstup nějakým způsobem ošetřit vstup. Já mám nejčastěji pro to připravenou PHP funkci, kterou s každým formulářem zavolám.
A použití je tedy nasnadě:
<!--?php echo ' <form action="' . osetrivstup($_SERVER['PHP_SELF']) . '" method="POST"-->'; echo ' <input type="hidden" name="hodnota" value="hodnota" /> '; echo ' <input type="submit" value="Odešli" /> '; echo ' '; ?> |