Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

PHP okénko: Escapování

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.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

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.

Jakub Vrána

Jakub Vrána

Autor se živí programováním v PHP, podílí se na jeho oficiální dokumentaci, vyučuje ho na MFF UK a vede odborná školení. Poznámky si zapisuje na weblog PHP triky.

Školení: Zavedení Google Apps do firmy

Cílem školení je provést účastníky jednotlivými kroky zavedení Google Apps na vlastní doménu a seznámit je se základy administrace, aby byli schopni Google Apps sami udržovat a rozvíjet dle potřeb. Účastníci se také dozví, jak používat základní služby v balíku Google Apps (Gmail, Kalendář, Dokumenty a Weby Google) a jaké jsou možnosti jejich využití ve firmě.

Podrobnější informace a přihláška  

Ohodnoťte jako ve škole:
Průměrná známka 2,84

Přehled názorů

kdy escapovat
Michal Molhanec 18. 4. 2005 00:33
Nový
└ 
Re: kdy escapovat
spaze 18. 4. 2005 02:22
Nový
 
└ 
Re: kdy escapovat
Michal Molhanec 18. 4. 2005 12:18
Nový
 
 
└ 
Re: kdy escapovatRe: kdy escapovat
spaze 18. 4. 2005 20:11
Nový
 
 
 
└ 
Re: kdy escapovatRe: kdy escapovat
Michal Molhanec 18. 4. 2005 22:00
Nový
 
 
 
 
└ 
Re: kdy escapovatRe: kdy escapovat
Jakub Vrána 19. 4. 2005 12:04
Nový
 
 
 
 
 
└ 
Re: kdy escapovat
spaze 19. 4. 2005 12:53
Nový
proč ne htmlencode předem
Michal Kubeček 18. 4. 2005 00:50
Nový
└ 
Re: proč ne htmlencode předem
Marián Černý 18. 4. 2005 03:14
Nový
 
├ 
CHYBKA ROOTu pri vkladani textu
Marián Černý 18. 4. 2005 03:25
Nový
 
│
├ 
Re: CHYBKA ROOTu pri vkladani textu
fbumake 18. 4. 2005 04:33
Nový
 
│
└ 
Re: CHYBKA ROOTu pri vkladani textu
Michal Kubeček 18. 4. 2005 12:28
Nový
 
├ 
Re: proč ne htmlencode předem
anonymní uživatel 18. 4. 2005 08:00
Nový
 
│
└ 
Re: proč ne htmlencode předem
Marián Černý 18. 4. 2005 14:07
Nový
 
└ 
Re: proč ne htmlencode předem
Michal Kubeček 18. 4. 2005 12:24
Nový
 
 
└ 
Re: vypínanie magic_quotes_gpc za behu
AraxoN 18. 4. 2005 14:19
Nový
 
 
 
├ 
Re: vypínanie magic_quotes_gpc za behu
Michal Kubeček 18. 4. 2005 14:32
Nový
 
 
 
│
└ 
Re: vypínanie magic_quotes_gpc za behu
AraxoN 18. 4. 2005 17:47
Nový
 
 
 
└ 
Re: vypínanie magic_quotes_gpc za behu
jkt 19. 4. 2005 17:25
Nový
 
 
 
 
└ 
Re: vypínanie magic_quotes_gpc za behu
AraxoN 20. 4. 2005 10:24
Nový
 
 
 
 
 
└ 
Re: vypínanie magic_quotes_gpc za behu
Michal Kubeček 20. 4. 2005 22:02
Nový
 
 
 
 
 
 
└ 
Re: vypínanie magic_quotes_gpc za behu
AraxoN 21. 4. 2005 13:38
Nový
 
 
 
 
 
 
 
└ 
Re: vypínanie magic_quotes_gpc za behu
Michal Kubeček 21. 4. 2005 21:38
Nový
jde to i bez addslashes()
Michal Kubeček 18. 4. 2005 00:58
Nový
byl sem nalitej jak motyka
bzuk a strup 18. 4. 2005 08:15
Nový
├ 
Re:
byl sem nalitej jak motyka
anonymní uživatel 18. 4. 2005 08:52
Nový
└ 
Re: byl sem nalitej jak motyka
benghi 29. 4. 2007 00:40
Nový
htmlentities
Kamil Podlešák 18. 4. 2005 10:07
Nový
stripslashes
llook 18. 4. 2005 11:24
Nový
├ 
Re: stripslashes
jkt 19. 4. 2005 17:26
Nový
└ 
Re: stripslashes
anonymní uživatel 21. 4. 2005 12:11
Nový
escaspovani je cunarna, navazování proměnných vám nic neříká.
petr andrs 22. 4. 2005 22:15
Nový
├ 
Re: escaspovani je cunarna, navazování proměnných vám nic neříká.
Michal Kubeček 22. 4. 2005 22:19
Nový
│
└ 
Re: escaspovani je cunarna, navazování proměnných vám nic neříká.
petr andrs 22. 4. 2005 22:23
Nový
└ 
Re: escaspovani je cunarna, navazování proměnných vám nic neříká.
alien2 2. 5. 2005 09:57
Nový
 
└ 
Re: escaspovani je cunarna, navazování proměnných vám nic neříká.
Jakub Vrána 2. 5. 2005 10:07
Nový
 
 
└ 
Re: escaspovani je cunarna, navazování proměnných vám nic neříká.
alien2 2. 5. 2005 10:09
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem