Bezpečnost především – zamezení interpretace HTML kódu

11. července 2002

Velice častou chybou v případech, kdy zobrazujete nějaký vstup od uživatele přímo, bez jakékoli kontroly, je, že uživatel může do textu vložit nějaké HTML tagy, ale také povely JavaScriptu (!). Populární je nastavení barvy písma na barvu podkladu, vložení nějakého hodně velkého a nebo hodně „obnaženého“ obrázku apod.

Vložený HTML kód je mnohdy i žádoucí (vložení odkazu, zvýraznění textu, například pomocí DHTML editoru), ale může zničit vzhled celé stránky. Neuzavřená tabulka způsobí, že se zbytek kódu již nezobrazí. Vložení meta-tagu pro refresh může způsobit přesměrování stránky úplně jinam. Ještě dnes naleznete na webu řadu knih návštěv, které lze naprosto ochromit vložením takovéhoto příspěvku:

<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://nejaka_nesmyslna_stranka.cz">

Vložený JavaScript může nejen poškodit vzhled stránky, přesměrovat stránku, ale může pomocí různých technik způsobit závažný bezpečnostní problém. Jde o tzv. session stealing a cross-site skripting a z toho plynoucí možný přístup třeba k cookies, které si stránka ukládá. Principy těchto technik probereme v dalším pokračování seriálu. Každopádně je nutné si uvědomit, že povely JavaScriptu lze vkládat s určitým omezením i jako parametr standardních HTML tagů. Jedná se o obsluhy různých událostí – onmouseover, onclick a další. Například pokud vložíme do diskusního fóra dlouhý text, který nelze zalomit, a nastavíme maximální velikost fontu, je na více než 90 % pravděpodobné, že čtenář takové stránky přejede přes tento text myší. Pokud zároveň do tagu font uvedeme povel pro přesměrování při přejetí myší, můžeme stránku třeba přesměrovat úplně jinam a to i tehdy, pokud jsme zakázali možnost vložení meta-tagu pro přesměrování.

<font size="7" onmouseover="window.location=’http://nejaka_nesmyslna_stranka.cz’">
nezalomitelný&nbsp;text&nbsp;nezalomitelný&nbsp;text
</font>

Chceme-li vytvořit knihu návštěv, diskusní fórum nebo chat, které mají být "žumpou", kam může kdokoli vložit cokoli (a já netvrdím, že to je špatně, někdy je prostě potřeba mít i takovouto aplikaci, když to návštěvníky stránek baví), je vše vpořádku. Pokud ale potřebujeme seriózní aplikaci, nebo velmi bezpečnou aplikaci, je potřeba z odesílaných příspěvků nebezpečné části odstranit. V závislosti na tom, jak moc bezpečná, řekněme "sterilní", má aplikace být, je třeba vyřadit celé tagy nebo vyřadit klíčová slova jako onmouseout, onmouseover anebo překonvertovat znaky <> na entity &lt; &gt;. Tagy se tak překonvertují na běžný text a nebudou se interpretovat (toto například umožní vkládání ukázek HTML kódu). Z již zmíněné možnosti session stealingu  je velmi nevhodné umožnit vkládání odkazů, a to i konverzí vložených URL na odkazy.

V PHP nám k různým úpravám předávaných textů poslouží tyto funkce:

$text = htmlspecialchars($text); // speciální znaky budou převedeny na entity, HTML kód se nebude interpretovat a bude zobrazen jako plain-text
$code = Str_Replace("<","&lt;",$code); // "ruční" vyřazení HTML tagů, znaky <> budou převedeny na entity;
$code = Str_Replace(">","&gt;",$code);
function undo_htmlspecialchars($string){ // příklad funkce, která provede zpětný převod po htmlspecialchars();
  $string = str_replace("&lt;", "<", $string);
  $string = str_replace("&gt;", ">", $string);
return $string;
}
$text=ereg_replace("<[^>]+>", "", $text); // regulární výraz, který odstraní tagy
$allowtags ="<marquee>,<blink>,<hr>,<ul>,<li>,<ol>,<p>,<br>,<font>,<b>,<u>,<i>,
<small>,<big>,<strong>,<em>,<a>,<img>";
$text = strip_tags($text,$allowtags); // podle mě nejestetičtější způsob odstranění nevhodných tagů v  případě, kdy chceme alespoň nějaké tagy povolit a nezáleží nám až tak kriticky na bezpečnosti
 

Posledním "hitem" používaným v různých diskusních forech je umožnit vkládání tagů pomocí speciální syntaxe, kerá je odlišná od HTML kódu. Teprve po odeslání příspěvku je tento pomocí regulárních výrazů upraven do korektního HTML kódu. Syntaxi si může každý zvolit vlastní, ohledně regulárních výrazů najdete několik článků zde na intervalu. Zde dávám jen ukázku, jak například vložit obrázek do takto řešeného diskusního fóra:

[img]http://www.plaudersmilies.de/partytime.gif[/img]

Věřím, že si z nabízených možností vyberete pro váš případ tu nejvhodnější. V dalším díle bude detailně rozveden princip cross-site skriptingu, proti němuž je nutno se bránit i v tomto článku zmíněným odstraněním HTML tagů.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *