sql >> Database teknologi >  >> RDS >> Mysql

Mangler ved mysql_real_escape_string?

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.



  1. MySQL forespørgsel / klausul udførelsesrækkefølge

  2. Find alle tabeller, der indeholder kolonne med angivet navn - MS SQL Server

  3. Hvordan Strftime()-funktionen virker i SQLite

  4. Sådan bygger du ubegrænset menuniveau gennem PHP og mysql