Proč nedůvěřovat PHP_SELF

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 '
 
';
?&gt;

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 '
 
';
?&gt;

O Petr Fořt

Student ČVUT FJFI KSE ASI (Softwarové inženýrství v ekonomii). Zajímám se o počítače (programování, diagnostika chyb hw), hudbu. Mám rád grilování, táboráky, hraní na kytaru a srandu v dobré společnosti.