sql >> Database >  >> RDS >> Mysql

Tekortkomingen van mysql_real_escape_string?

De belangrijkste tekortkoming van mysql_real_escape_string , of van de mysql_-extensie in het algemeen, is dat het moeilijker is om correct toe te passen dan andere, modernere API's, met name voorbereide instructies. mysql_real_escape_string wordt verondersteld te worden gebruikt in precies één geval:escape-tekstinhoud die wordt gebruikt als een waarde in een SQL-instructie tussen aanhalingstekens. Bijv.:

$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
                     ^^^^^^

mysql_real_escape_string zorgt ervoor dat de $value in de bovenstaande context verpest de SQL-syntaxis niet. Het werkt niet zoals je hier misschien denkt:

$sql = "... `foo` = $value ...";

of hier:

$sql = "... `$value` ...";

of hier:

$sql = mysql_real_escape_string("... `foo` = '$value' ...");

Indien toegepast op waarden die worden gebruikt in een andere context dan een tekenreeks tussen aanhalingstekens in een SQL-instructie, wordt deze verkeerd toegepast en kan de resulterende syntaxis al dan niet worden verstoord en/of kan iemand waarden indienen die SQL-injectie-aanvallen mogelijk maken. Het gebruik van mysql_real_escape_string is erg smal, maar wordt zelden goed begrepen.

Een andere manier om jezelf in warm water te krijgen met mysql_real_escape_string is wanneer u de codering van de databaseverbinding instelt met de verkeerde methode. Je zou dit moeten doen:

mysql_set_charset('utf8', $link);

Je kunt doe dit echter ook:

mysql_query("SET NAMES 'utf8'", $link);

Het probleem is dat de laatste de mysql_ API omzeilt, die nog steeds denkt dat je met de database praat via latin1 (of iets anders). Bij gebruik van mysql_real_escape_string nu neemt het de verkeerde tekencodering en escape-strings anders aan dan de database ze later zal interpreteren. Door de SET NAMES . uit te voeren query, hebt u een kloof gecreëerd tussen hoe de mysql_ client-API tekenreeksen behandelt en hoe de database deze tekenreeksen zal interpreteren. Dit kan worden gebruikt voor injectie-aanvallen in bepaalde multibyte-stringsituaties.

Er zijn geen fundamentele kwetsbaarheden voor injectie in mysql_real_escape_string waarvan ik weet of het correct is toegepast. Maar nogmaals, het grootste probleem is dat het angstaanjagend eenvoudig is om het verkeerd toe te passen, waardoor kwetsbaarheden ontstaan.



  1. Redundante gegevens in update-statements

  2. SQL Server-prestatiebestand IO-statistieken

  3. MySQL:een MySQL-database klonen op dezelfde MySql-instantie

  4. Array-aanwijzer resetten in PDO-resultaten