Den största bristen i mysql_real_escape_string
, eller av mysql_-tillägget i allmänhet, är att det är svårare att applicera korrekt än andra, mer moderna API:er, speciellt förberedda uttalanden. mysql_real_escape_string
är tänkt att användas i exakt ett fall:escapende textinnehåll som används som ett värde i en SQL-sats mellan citattecken. T.ex.:
$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
^^^^^^
mysql_real_escape_string
ser till att $value
i ovanstående sammanhang förstör inte SQL-syntaxen. Det fungerar inte som du kanske tror här:
$sql = "... `foo` = $value ...";
eller här:
$sql = "... `$value` ...";
eller här:
$sql = mysql_real_escape_string("... `foo` = '$value' ...");
Om de tillämpas på värden som används i något annat sammanhang än en citerad sträng i en SQL-sats, tillämpas den felaktigt och kan eventuellt förstöra den resulterande syntaxen och/eller tillåta någon att skicka in värden som kan möjliggöra SQL-injektionsattacker. Användningsfallet för mysql_real_escape_string
är mycket smal, men förstås sällan korrekt.
Ett annat sätt att få dig själv i varmt vatten med mysql_real_escape_string
är när du ställer in databasanslutningskodningen med fel metod. Du bör göra så här:
mysql_set_charset('utf8', $link);
Du kan gör även det här:
mysql_query("SET NAMES 'utf8'", $link);
Problemet är att det senare går förbi mysql_ API, som fortfarande tror att du pratar med databasen med latin1
(eller något annat). När du använder mysql_real_escape_string
nu kommer den att anta fel teckenkodning och escape-strängar annorlunda än vad databasen tolkar dem senare. Genom att köra SET NAMES
fråga, har du skapat en klyfta mellan hur mysql_-klientens API behandlar strängar och hur databasen kommer att tolka dessa strängar. Detta kan användas för injektionsattacker i vissa situationer med flera bytesträngar.
Det finns inga grundläggande injektionssårbarheter i mysql_real_escape_string
som jag är medveten om om den tillämpas korrekt. Återigen är dock huvudproblemet att det är skrämmande lätt att applicera det felaktigt, vilket öppnar upp för sårbarheter.