PHP okénko: Escapování

Jakub Vrána 18. 4. 2005

Dnešní PHP okénko připomíná nutnost správného escapování dat a popisuje funkce, které jsou k tomu účelu obsaženy v PHP.

V PHP jsou tři základní escapovací funkce, které se používají v různých situacích: addslashes, htmlspecialchars a urlencode.

Funkce addslashes se používá většinou při ukládání dat do databáze. Funkce doplní zpětné lomítko před apostrof, uvozovky a zpětné lomítko, takže text obsahující tyto znaky obalený apostrofy nebo uvozovkami může být bez obav použit v SQL dotazu. Při ukládání proměnných zvenku tuto funkci používejte pouze v případě, že není zapnutá direktiva magic_quotes_gpc, jinak dojde k dvojitému escapování. Některé databáze (např. MySQL) si vystačí s touto funkcí i při ukládání binárních dat, jiné pro escapování těchto dat potřebují použít vlastní funkci – např. SQLite používá funkci sqlite_escape_strin­g.

Funkce htmlspecialchars se používá při vypisování textu, ve kterém nechceme interpretovat HTML značky – řídící znaky <>"& se převedou na odpovídající HTML entity – tedy např. < na &lt;. Použití této funkce by mělo být samozřejmostí při vypisování neošetřeného textu a při používání proměnných v hodnotách atributů HTML značek, např. value.

<?php
// špatně - proměnná může obsahovat speciální HTML znaky
echo "<input name='search' value='$_GET[search]' />\n";

// špatně - proměnná může obsahovat apostrof
echo "<input name='search' value='" . htmlspecialchars($_GET["search"]) . "' />\n";

// správně - případné uvozovky jsou spolu s ostatními speciálními znaky defaultně escapovány
echo "<input name=\"search\" value=\"" . htmlspecialchars($_GET["search"]) . "\" />\n";

// správně - escapován bude i apostrof
echo "<input name='search' value='" . htmlspecialchars($_GET["search"], ENT_QUOTES) . "' />\n";
?> 

Funkci htmlspecialchars je zvykem používat na výstupu, i když by ji z výkonnostních důvodů bylo někdy lepší použít např. už při ukládání dat do databáze. Nedělá se to ze dvou důvodů – jednak by kvůli větší délce escapovaného textu mohl být zkrácen řetězec přesto, že uživatel maximální délku nepřekročil, a jednak by někdo do databáze mohl nestandardním způsobem vložit neošetřená data, která by při výpisu způsobila paseku.

Funkce urlencode se používá při ošetřování řetězce předávaného v URL. Funkce nahradí všechny nealfanumerické znaky kromě -_. jejich URL reprezentací – tedy znakem % následovaným dvojicí hexadecimálních číslic (mezera se převede na +). Pokud tedy chceme vytvořit přehled nejčastěji hledaných výrazů, měli bychom to udělat nějak takhle:

<?php
$result = mysql_query("SELECT search, pocet FROM searches ORDER BY pocet DESC LIMIT 10");
while ($row = mysql_fetch_assoc($result)) {
    echo "<li><a href='?search=" . urlencode($row["search"]) . "'>" . htmlspecialchars($row["search"]) . "</a> ($row[pocet])</li>\n";
}
mysql_free_result($result);
?> 

Kromě těchto základních escapovacích funkcí v PHP samozřejmě existují další, např. quotemeta nebo preg_quote. Vždycky jde o to zamyslet se nad tím, jestli v daném kontextu náhodou nejsou některé znaky speciální, a pokud ano, tak je správně ošetřit. Podle mého názoru je správné escapování jednou z vlastností, které odlišují kvalitní webové aplikace od těch ostatních.


Podobně laděné texty můžete najít i na autorově weblogu PHP triky.

Ohodnoťte jako ve škole:

Průměrná známka 2,84

Našli jste v článku chybu?
Zasílat nově přidané názory e-mailem
120na80.cz: Zjistěte, zda je vaše klíště infikované

Zjistěte, zda je vaše klíště infikované

120na80.cz: Tady se vaří padělané léky

Tady se vaří padělané léky

120na80.cz: Co lidi tropí se sádrou

Co lidi tropí se sádrou

Vitalia.cz: Tetanus v USA – i po odřeninách

Tetanus v USA – i po odřeninách

120na80.cz: Co jí dělá? Sklerotizaci

Co jí dělá? Sklerotizaci

DigiZone.cz: Šlágr TV: pokuta 100 tisíc za on-line

Šlágr TV: pokuta 100 tisíc za on-line

Podnikatel.cz: Alza radí e-shopům, jak opustit Heureku

Alza radí e-shopům, jak opustit Heureku

Vitalia.cz: Dnešní patolog o mrtvolu téměř nezavadí

Dnešní patolog o mrtvolu téměř nezavadí

Vitalia.cz: Muži kouří 24 cigaret denně, ženy o dost míň

Muži kouří 24 cigaret denně, ženy o dost míň

Lupa.cz: Přenos hokeje padal kvůli útoku, tvrdí O2

Přenos hokeje padal kvůli útoku, tvrdí O2

DigiZone.cz: Konec geoblokace online médií?

Konec geoblokace online médií?

Vitalia.cz: Proč máme prasklý chléb nejraději?

Proč máme prasklý chléb nejraději?

Vitalia.cz: Mražené ryby z Makra byly falšované

Mražené ryby z Makra byly falšované

Podnikatel.cz: Konečně vývar. Skoro jako od Steva Jobse

Konečně vývar. Skoro jako od Steva Jobse

Vitalia.cz: Taky ji kupujete? Je šizená

Taky ji kupujete? Je šizená

Podnikatel.cz: Přechod z OSVČ na firmu? Totální šok!

Přechod z OSVČ na firmu? Totální šok!

DigiZone.cz: UPC umí televizi sedm dní nazpět

UPC umí televizi sedm dní nazpět

Podnikatel.cz: Rošáda v živnostech. Týká se vás?

Rošáda v živnostech. Týká se vás?

Vitalia.cz: Ministerstvo: tyto příbory jsou nebezpečné

Ministerstvo: tyto příbory jsou nebezpečné

Vitalia.cz: Syndrom počítačového vidění: stačí dvě hodiny denně

Syndrom počítačového vidění: stačí dvě hodiny denně