Het slechte antwoord:
Niet betrouwbaar. Je verwijst naar mysql_escape_string()
, die geen rekening houdt met de verbindingscodering (terwijl mysql_real_escape_string()
doet).
Dus misschien een zorgvuldig vervaardigde string, met een zorgvuldig vervaardigd onvolledig UTF8-codepunt ervoor, misschien resulteren in, laten we zeggen, een aanhalingsteken dat wordt ontsnapt door mysql_escape_string()
maar de ontsnapping zelf wordt genegeerd door MySQL omdat het het zal "zien" als een UTF8-teken.
Bijv.:
0xC2' OR 1=1 ;--
zou worden ontsnapt door mysql_escape_string()
als
0xC2\' OR 1=1 ;--
die zou worden geassembleerd om
WHERE password='0xC2\' OR 1=1 ;--';
en gezien door MySQL (als de juiste verbindingscodering van kracht was) als, laten we zeggen,
WHERE password='€' OR 1=1 ;[--';] <-- the bracketed part is considered a comment and ignored
wat een klassieke SQL-injectie zou zijn.
Maar dit speelt in op het feit dat je, misschien door afleiding, een dubbel afgekeurde functie hebt gespecificeerd . Als je echt verwijst naar mysql_real_escape_string()
, dan zou het niet werken.
Dit veronderstelt ook dat noch de server, noch de applicatielaag (bijv. PHP) enige vorm van karakterset-validatie gebruikt bij het vullen van de invoer. Als ze dat deden, zou de ongeldige UTF8 bij aankomst worden verwijderd en zelfs nooit worden gezien door mysql_escape_string
, wat dan natuurlijk genoeg zou zijn.
Het echte antwoord:
Gebruik geen mysql_escape_string
(of mysql_whatever
) helemaal niet. Ze zijn verouderd en uw code werkt mogelijk niet meer. Gebruik in plaats daarvan PDO-functies.