sql >> Databáze >  >> RDS >> Mysql

Nedostatky mysql_real_escape_string?

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.



  1. LIKE vs CONTAINS na SQL Server

  2. Prodleva Oracle mezi potvrzením a výběrem

  3. TypeError:Objekt 'int' nepodporuje indexování

  4. SQL Server:Získejte primární klíč tabulky pomocí dotazu SQL