Obrana proti XSS útokům v PHP

Pokud Vám někdo do inputu, nebo třeba jako název obrázku (který nahraje) vloží nebezpečný JS, který nemáte převedený na entity, vystavujete se tak nebezpečí.

XSS útok na nejmenší úrovni může třeba jen vyalertovat text. Stačí pokud do vstupu (text, file, mail) vloží nebezpečný JS kód (= XSS útok). XSS útok může vypadat například takto:

' onmouseover='alert(1)' data-foo='.jpg

To je ukázka XSS útoku v případě, že nahráváte fotku a uložíte ji pod výše zmíněným názvem. Po najetí na odkaz (po nahrání) se alertem vypíše jednička. A takto se dá zneužít jedna bezpečností díra. Pokud input, nebo file pojmenujeme ve specifikaci jako name=“text“ – př.

<input type="text" size="30" name="text">

můžeme použít PHP kód, který všechny nepovolené znaky (apostrofy, uvozovky, ostré závorky, apod…) změní na entity, které se vypíší jako entity (nepřepíší se na text). Funkce, která to umí se jmenuje htmlspecialchars. Ukážeme si příklad, pokud jsme input (či cokoliv jiného, do čeho se dá vložit text) pojmenovali name=“text“ a ten přes hodnotu POST dali do proměnné $text:

$novapromenna = htmlspecialchars($text, ENT_QUOTES);

Což nám zajistí, že obsah proměnné $text (ve které je uložen obsah inputu) se převede na entity. Převedený text se nám uloží do nové proměnné $novapromenna, se kterou můžeme již dále pracovat (je zaentinovaná). Když je zaentinovaná, znamená to, že se škodlivý XSS útok nespustí, což je pro nás dobře.

Takže aktuální obsah proměnné $novapromenna je například (pokud použiji původní škodlivý kód):

&amp;amp;#039; onmouseover=&amp;amp;#039;alert(1)&amp;amp;#039; foo=&amp;amp;#039;.jpg

Což je správně zaentinovaný útok. Prostě se všechny neobvyklé znaky (které nejsou v klasické latinské abecedě) zaentinují. Doufám, že jste článek pochopili, případně využijte komentářů níže pod článkem.

2 komentáře u „Obrana proti XSS útokům v PHP“

Napište komentář!