Hlavní nedostatek mysql_real_escape_string
, nebo rozšíření mysql_ obecně je, že je obtížnější správně aplikovat než jiná, modernější API, zejména připravené příkazy. mysql_real_escape_string
má být použit přesně v jednom případě:escapování textového obsahu, který je použit jako hodnota v příkazu SQL mezi uvozovkami. Např.:
$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
^^^^^^
mysql_real_escape_string
zajišťuje, že $value
ve výše uvedeném kontextu nenarušuje syntaxi SQL. Tady to nefunguje, jak si možná myslíte:
$sql = "... `foo` = $value ...";
nebo zde:
$sql = "... `$value` ...";
nebo zde:
$sql = mysql_real_escape_string("... `foo` = '$value' ...");
Pokud se použije na hodnoty, které jsou použity v jakémkoli jiném kontextu, než je řetězec v uvozovkách v příkazu SQL, je to nesprávně použito a může nebo nemusí zkazit výslednou syntaxi a/nebo umožnit někomu zadat hodnoty, které mohou umožnit útoky SQL injection. Případ použití mysql_real_escape_string
je velmi úzký, ale jen zřídka je správně pochopen.
Další způsob, jak se dostat do horké vody, pomocí mysql_real_escape_string
je, když nastavíte kódování připojení k databázi pomocí nesprávné metody. Měli byste udělat toto:
mysql_set_charset('utf8', $link);
můžete udělejte to také:
mysql_query("SET NAMES 'utf8'", $link);
Problém je v tom, že to druhé obchází mysql_ API, které si stále myslí, že mluvíte s databází pomocí latin1
(nebo něco jiného). Při použití mysql_real_escape_string
nyní bude předpokládat nesprávné kódování znaků a escape řetězce jinak, než je bude databáze interpretovat později. Spuštěním SET NAMES
dotazu, vytvořili jste trhlinu mezi tím, jak rozhraní mysql_ client API zachází s řetězci, a tím, jak bude databáze tyto řetězce interpretovat. To může být použito pro injekční útoky v určitých situacích s vícebajtovými řetězci.
mysql_real_escape_string
neobsahuje žádné zásadní chyby zabezpečení že vím, jestli je aplikován správně. Hlavním problémem však opět je, že je děsivě snadné jej nesprávně použít, což otevírá zranitelnosti.