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.