strip_tags

Školení, která pořádám

V PHP je k dispozici funkce strip_tags, která slouží pro oříznutí HTML a PHP značek z řetězce. Tato funkce se dá použít např. v případě, kdy chceme z HTML dokumentu získat jeho textovou složku.

Velice často se tato funkce bohužel používá i pro výpis dat zadaných uživatelem jako prevence před XSS. To má ale řadu poměrně vážných nevýhod:

Funkce strip_tags se na ošetřování uživatelských vstupů zkrátka vůbec nehodí. Pokud zpracování HTML značek např. v diskusních příspěvcích dovolit nechceme, je vhodné to na stránku napsat a výstup ošetřit např. funkcí htmlspecialchars a nl2br.

Pokud uživateli chceme dovolit používat jen některé značky, nabízí nám funkce strip_tags možnost předat jí druhý parametr a tím povolené značky určit. Toto použití je ale snad ještě horší – funkce totiž ze značek neořízne atributy a uživatel tak může např. pomocí atributu style zcela rozhodit celou stránku nebo pomocí atributů pro obsluhu událostí vykonat libovolný JavaScriptový kód.

Pokud chceme uživatelům nějaké formátování povolit, je asi nejlepší použít na to přímo nějaký nástroj. Formátování pomocí HTML značek stejně není pro nezkušené uživatele právě nejpřirozenější. Kvalitní a v českém prostředí oblíbené je např. Texy!, podobných nástrojů ale samozřejmě existuje nepřeberné množství. Pokud podobný nástroj použijete, je vhodné dát na stránky alespoň stručnou nápovědu (třeba jen jak vložit odkaz a jak vytvořit odstavec) a odkaz na kompletní dokumentaci syntaxe. Pokud formátování pomocí HTML umožnit chcete, nezapomeňte na odstranění nežádoucích značek (např. script), atributů (např. onmouseover) a jejich hodnot (např. href="javascript:…" nebo style="background-image: url('javascript:…');").

Jakub Vrána, Výuka, 20.1.2006, diskuse: 10 (nové: 0)

Diskuse

Michal:

Hlavne kdyz je pouzito nejake nestandardni formatovadlo typu Texy! tak je skoro nutne bud:
- mit testovaci formular, nebo
- mit moznost ukazat nahled driv nez bude prispevek nadobro zarazen, nebo
- mit moznost editovat uz odeslany prispevek.

U HTML vim jak to bude vypadat, jenze nejake pokrocile Texy! formatovani pouziju jednou za pul roku a pak to vetsinou na prvni pokus netrefim a zbytecne zasiram komentare rozhazenymi prispevky a navic vypadam jak nemehlo ;-)

tracy:

Taky si myslím, že Texy! se pro komentáře zrovna moc nehodí. A mám zkušenost, že úplně stačí jeden odlišný druh formátování a basta. Např. "text ve složených závorkách se zobrazí tučně".. Uživatel chápe a nic víc většinou ani nepotřebuje.

Jenda:

Osobně si myslim že uživatelů, kteří budou chtít využívat html formátování je minimum a největší důraz by měl být asi kladen na obsah - takže strip_tags bych se nebál používat...

ikona Jakub Vrána OpenID:

Zjevně došlo k nepochopení. Když uživatelům nechci povolit zadávat formátování přes HTML značky (jako je to třeba tady), tak je nesmysl je ořezávat, ale mnohem lepší je převést text třeba funkcí htmlspecialchars. Důvody jsou aspoň tři a jsou popsané v článku.

lukas:

ale to tam pak ty elementy zustanou protoze se prevede <> na entity,

co treba nejak
$text = htmlspecialchars(ereg_replace("<[^>]+>", "", trim($text)), ENT_QUOTES);

ikona Jakub Vrána OpenID:

Vždyť to je cílem. Co když používáš funkci strip_tags (nebo tvojí obdobu) a někdo chce skutečně zadat zápis HTML značky, třeba "Pokud chceš vytvořit odkaz, použij <a href=>"? Značka se vyhodí a z textu zbude nesmysl. Co když chce někdo napsat x<3? Vznikne nesmysl. Co když chce člověk vložit ukázku PHP nebo i jiného kódu? Nesmysl.

Co když někdo zadá &? Vznikne nevalidní kód. Málokdo systém pochopí a bude psát &lt;, &gt; a &amp;.

Pokud v příspěvcích nechceš HTML značky, tak to vedle políčka napiš (jako je to třeba tady) a použij htmlspecialchars.

paradentóza:

Mám otázku, která hraničí s tématem tohoto článku:
mám funkci, která mi podle jakési cesty vypíše drobečkové menu (již v HTML), ale v jednom konkrétním případě chci umožnit hledat mezi ""adresáři"" (nebo chcete-li, kategoriemi) a u výsledku zvýraznit, kde se slovo nebo část shoduje (např. když zadá uživatel "straka" a já budu mít (mj.) kategorii "strakaté textilie", tak to v nich zvýrazní prvních 5 písmen - třeba tak, že je vypíše zeleně nebo jánevim). Normálně bych to dělal asi přes <?php str_replace() ?>, ale problém je v tom, že už je to v HTML a když někdo zadá třeba "href", tak to vloží značky doprostřed značky čímž to znevalidní HTML kód. Jedno řešení už mě napadlo (testovat, zda-li zvýrazňovat, i uprostřed samotné funkce), ale - ryze akademicky - dalo by se to řešit i jinak (kdy bych ten hotový HTML kód prostě dostal a nemohl ovlivnit to, jak se vygeneroval a současně ho musel zpracovat)?

ikona Jakub Vrána OpenID:

http://php.vrana.cz/zvyrazneni-vysledku-vyhledavani.php

Jakub:

Má funkce nl2br nějaké atributy (například maximální počet odentrování), nebo když chci počet odentrování omezit musím použít něco jiného?

cvičební úbor:

Můžeš si k ní napsat svoji vlastní "advanced" alternativu:
omezení maximálního počtu odentrování provedeš přes vlastní funkci v preg_replace_callback()

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.