web-dev-qa-db-fra.com

MySQL_Escape_string a-t-il des vulnérabilités de sécurité si toutes les tables utilisent le codage Latin1?

J'ai entendu dire que la fonction PHP mysql_escapape_string a des vulnérabilités de sécurité liées à des caractères mults octets. Y a-t-il des vulnérabilités si toutes les tables utilisent le codage latin1?

7
user5385

Le problème est que mysql_escape_string() ne vérifie pas la base de données pour codage de caractères. Par conséquent, mysql_escape_string() On ignorerait votre codage de la base de données et peut traiter des caractères multi-octets comme des caractères d'octets individuels. Cela pourrait entraîner des deux derniers octets s'échappés dans un caractère réservé tel que Ainsi que d'innombrables autres caractères qui ont une pertinence particulière pour le moteur SQL.

Dans un tel cas, l'attaquant pourrait ajouter des commandes SQL supplémentaires pour accéder aux données ou aux fonctions non destinées. C'est pourquoi la fonction est obsolète et l'utilisation de mysql_real_escape_string() est recommandée.

mysql_real_escape_string() fonctionne presque identique, sauf que celle-ci se connecte à la base de données pour déterminer le codage utilisé par la base de données, empêchant ainsi les problèmes d'échappement multi-octets connus.

Notez également que mysql_escape_string() et mysql_real_escape_string() N'apuisez pas les caractères% et _ (selon la référence manuelle http://php.net/manual/fr/function. mysql-escape-string.php et http://php.net/manual/fr/function.mysql-real-escape-string.php Voir notes). Cela pourrait permettre l'accès aux données qui ne sont pas destinées lorsqu'elles sont utilisées avec des mots-clés tels que LIKE, de sorte que les soins spéciaux devraient être pris.


Mise à jour

Alors, quel codage est-ce que mysql_escapape_string assume?

Je crois que c'est ASCII, mais je suis incapable de le confirmer. Peu importe que cela ne fait aucune différence pour le résultat qui est; L'utilisation de latin1 pour le codage de la base de données pourrait entraîner une vulnérabilité de sécurité s'il n'est pas codé correctement.

Notez également que ce n'est pas seulement une vulnérabilité avec la base de données. Dans le script d'application/côté serveur, vous devez faire attention lorsque la manipulation d'entrée doit être consciente de la manière dont les chaînes sont transmises de fonction à la fonction et assurez-vous que le codage correct est préservé. Idéalement, utiliser UTF-8 End-Townt serait bon mais pas toujours une option.

7
Bernie White

Personnellement, je pense que vous posez la mauvaise question. Si vous souhaitez éviter les vulnérabilités d'injection SQL - aussi, la réponse est de ne pas utiliser mysql_escape_string plus attentivement. La bonne réponse est d'utiliser des déclarations préparées.

Le problème fondamental est que mysql_escape_string est fragile, et il est difficile de prédire toutes les façons spécifiques dans lesquelles il pourrait se casser. Vous avez appris une source de fragilité dans mysql_escape_string, et maintenant me demande si c'est la seule source.

Personnellement, je prends une leçon différente. La leçon que je dessine est que, si la sécurité est le travail, mysql_escape_string est le mauvais outil pour le travail. Au lieu de cela, vous devriez utiliser des déclarations préparées (requêtes paramétrées).

Parmi le monde de la sécurité, il est assez largement admis que la manière la plus robuste d'éviter l'injection SQL est d'utiliser des déclarations préparées. N'essayez pas d'échapper/encoder vos données, puis de construire une requête SQL à l'aide de la concaténation de la chaîne; Cette approche est fragile et peut facilement casser si, par exemple, la base de données interprète votre requête différemment de celle attendue. Mon conseil est donc: N'essayez pas d'être intelligent - utilisez simplement des déclarations préparées et soyez heureux.

6
D.W.