38 votes

Mysql_real_escape_string () protège-t-il ENTIÈREMENT contre l'injection SQL?

Sur http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-this , il y a un article qui prétend que vous pouvez contourner mysql_real_escape_string avec certains pays d'Asie codages de caractères

En contournant mysql_real_escape_string() avec BIG5 ou GBK

"l'injection de la chaîne"
に関する追加情報:

ci-dessus les caractères sont Chinois Big5

Est-ce vraiment vrai? Et si oui, comment feriez-vous pour protéger votre site web contre cela, si vous n'avez pas eu accès à des déclarations préparées à l'avance?

25voto

Josh Davis Points 12974

Selon Stefan Esser, "mysql_real_escape_string() [est] pas sûr lorsqu' SET NAMES est utilisé."

Son explication, à partir de son blog:

Nom de l'ENSEMBLE est généralement utilisé pour changer l'encodage à partir de ce qui est par défaut à ce que les besoins de l'application. C'est fait d'une manière qui mysql_real_escape_string ne savent pas à ce sujet. Cela signifie que si vous passez à certains multi octets codage qui permet de barre oblique inverse comme 2ème 3ème 4ème octet... vous rencontrez un problème, car mysql_real_escape_string n'échappe pas correctement. UTF-8 est sûr...

Sûr moyen de changer l'encodage est - mysql_set_charset, mais qui n'est disponible que dans les nouvelles versions de PHP

Il mentionne que l'UTF-8 est sûre, cependant.

19voto

Bill Karwin Points 204877

C'est un serveur MySQL bug qui aurait été fixé chemin du retour en Mai 2006.

Voir:

  • MySQL bug #8303: les littéraux de Chaîne avec des caractères multi-octets contenant \ sont lexed de manière incorrecte
  • MySQL Bug n ° 8317: jeu de Caractères introducteur dans la requête ne parvient pas à remplacer de connexion jeu de caractères
  • MySQL Bug n ° 8378: String échappé à tort avec le jeu de caractères client 'gbk'
  • MySQL 5.1.11 changelog.

Le bug a été signalé fixe dans MySQL 4.1.20, 5.0.22, 5.1.11.

Si vous utilisez 4.1.x, 5.0.x, ou 5.1.x, assurez-vous que vous avez mise à niveau au moins pour le mineur que les numéros de révision.

Comme solution de contournement, vous pouvez également activer le mode SQL NO_BACKSLASH_ESCAPES qui désactive la barre oblique inverse comme une citation-caractère d'échappement.

3voto

alex Points 186293

Je suis presque sûr que ça ne marche pas si vous utilisez SQL pour changer le codage des caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X