sql >> Databasteknik >  >> RDS >> Mysql

Brister med mysql_real_escape_string?

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.



  1. Hur jämför jag två rader från samma tabell (SQL-server)?

  2. Läs Isolering av engagerad ögonblicksbild

  3. Få tabellnamn med hjälp av SELECT-satsen i MySQL

  4. Hur ställer man in värde till variabel med 'execute' i t-sql?