De plus amples recherches, j'ai trouvé:
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
Correction de sécurité:
Un trou de sécurité d'injection SQL a été détecté dans le traitement de codage multi-octets. Le bogue se trouvait sur le serveur, analysant de manière incorrecte la chaîne échappée avec la fonction de l'API C mysql_real_escape_string().
Cette vulnérabilité a été découverte et rapportée par Josh Berkus et Tom Lane dans le cadre de la collaboration inter-projets sur la sécurité du consortium OSDB. Pour plus d'informations sur l'injection SQL, consultez le texte suivant.
Discussion. Un trou de sécurité d'injection SQL a été trouvé dans le traitement de codage multi-octets. Un trou de sécurité d'injection SQL peut inclure une situation où, lorsqu'un utilisateur fournit des données à insérer dans une base de données, l'utilisateur peut injecter des instructions SQL dans les données que le serveur va exécuter. En ce qui concerne cette vulnérabilité, lorsque l'échappement character set-aware est utilisé (par exemple, addslashes() en PHP), il est possible de contourner l'échappement dans certains jeux de caractères multi-octets (par exemple, SJIS, BIG5 et GBK). Par conséquent, une fonction telle que addslashes() ne peut pas empêcher les attaques par injection SQL. Il est impossible de résoudre ce problème du côté serveur. La meilleure solution consiste pour les applications à utiliser l'échappement par jeu de caractères offert par une fonction telle que mysql_real_escape_string().
Cependant, un bug a été détecté dans la façon dont le serveur MySQL analyse la sortie de mysql_real_escape_string().Par conséquent, même lorsque la fonction mysql_real_escape_string() a été utilisée, l'injection SQL était possible. Ce bug a été corrigé.
Solutions de contournement. Si vous ne parvenez pas à mettre à niveau MySQL vers une version qui inclut la correction du bogue dans l'analyse mysql_real_escape_string(), mais exécutez MySQL 5.0.1 ou une version ultérieure, vous pouvez utiliser le mode SQL NO_BACKSLASH_ESCAPES comme solution de contournement. (Ce mode a été introduit dans MySQL 5.0.1.) NO_BACKSLASH_ESCAPES active un mode de compatibilité standard SQL, où la barre oblique inverse n'est pas considérée comme un caractère spécial. Le résultat sera que les requêtes échoueront.
Pour définir ce mode pour la connexion en cours, entrez l'instruction SQL suivante:
SET sql_mode='NO_BACKSLASH_ESCAPES';
Vous pouvez également définir le mode globalement pour tous les clients:
SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';
Ce mode SQL peut également être activé automatiquement lorsque le serveur démarre en utilisant l'option de ligne de commande --sql-mode = NO_BACKSLASH_ESCAPES ou en définissant sql-mode = NO_BACKSLASH_ESCAPES dans le fichier d'options du serveur (par exemple, my.cnf ou my.ini, en fonction de votre système) . (Bogue n ° 8378, CVE-2006-2753)
Voir également le bogue n ° 8303.
+1 J'écris moi-même la classe MySQL et j'utilise mysql_real_escape_string() à des fins de liaison de paramètres. J'évite d'utiliser mysqli car tous les hébergeurs ne le supportent pas. J'évite également la bibliothèque de multi-dossier et de multi-classe. Ce dont j'ai besoin, c'est juste une classe unique soignée et propre. Je vous remercie! – Viet
http://ca2.php.net/manual/fr/function.addslashes.php – mpen
+1 pour moi aussi. Mon cas d'utilisation est un APi SugarCRM dans lequel j'ai besoin de pousser des fragments de SQL vers l'instance distante de SugarCRM via l'API. Nasty bien que ce soit, c'est ce que je dois travailler avec (aller frapper quelques têtes de dev SugarCRM ensemble). J'ai besoin d'échapper des chaînes dans SQL dans l'application qui utilise l'API et qui est totalement séparée de la base de données derrière l'instance de SugarCRM. – Jason