Den største mangel ved mysql_real_escape_string
, eller af mysql_-udvidelsen generelt, er, at det er sværere at anvende korrekt end andre, mere moderne API'er, især forberedte udsagn. mysql_real_escape_string
formodes at blive brugt i præcis ét tilfælde:escape-tekstindhold, der bruges som en værdi i en SQL-sætning mellem anførselstegn. F.eks.:
$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
^^^^^^
mysql_real_escape_string
sørger for, at $value
i ovenstående sammenhæng ødelægger ikke SQL-syntaksen. Det virker ikke, som du måske tror her:
$sql = "... `foo` = $value ...";
eller her:
$sql = "... `$value` ...";
eller her:
$sql = mysql_real_escape_string("... `foo` = '$value' ...");
Hvis den anvendes på værdier, der bruges i en hvilken som helst anden kontekst end en citeret streng i en SQL-sætning, anvendes den forkert og kan muligvis ikke ødelægge den resulterende syntaks og/eller tillade nogen at indsende værdier, der kan aktivere SQL-injektionsangreb. Brugstilfældet for mysql_real_escape_string
er meget smal, men er sjældent korrekt forstået.
En anden måde at få dig selv i varmt vand ved hjælp af mysql_real_escape_string
er, når du indstiller databaseforbindelseskodningen ved hjælp af den forkerte metode. Du skal gøre dette:
mysql_set_charset('utf8', $link);
Du kan gør dog også dette:
mysql_query("SET NAMES 'utf8'", $link);
Problemet er, at sidstnævnte omgår mysql_ API, som stadig tror, du taler til databasen ved hjælp af latin1
(eller noget andet). Når du bruger mysql_real_escape_string
nu vil den antage den forkerte tegnkodning og escape-strenge anderledes, end databasen vil fortolke dem senere. Ved at køre SET NAMES
forespørgsel, har du skabt en kløft mellem, hvordan mysql_-klient-API'en behandler strenge, og hvordan databasen vil fortolke disse strenge. Dette kan bruges til injektionsangreb i visse situationer med flere bytestrenge.
Der er ingen grundlæggende injektionssårbarheder i mysql_real_escape_string
som jeg er klar over hvis det er anvendt korrekt. Igen er hovedproblemet dog, at det er skræmmende nemt at anvende det forkert, hvilket åbner op for sårbarheder.