J'aimerais avoir une fonction se comportant comme mysql_real_escape_string sans me connecter à la base de données car parfois je dois faire des tests à sec sans connexion à la base de données. mysql_escape_string est obsolète et n'est donc pas souhaitable. Certaines de mes découvertes:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
Réponses:
Il est impossible d'échapper en toute sécurité à une chaîne sans connexion DB.
mysql_real_escape_string()
et les instructions préparées nécessitent une connexion à la base de données afin de pouvoir échapper à la chaîne en utilisant le jeu de caractères approprié - sinon, les attaques par injection SQL sont toujours possibles en utilisant des caractères multi-octets.Si vous ne faites que tester , vous pouvez aussi bien l'utiliser
mysql_escape_string()
, ce n'est pas garanti à 100% contre les attaques par injection SQL, mais il est impossible de créer quelque chose de plus sûr sans une connexion DB.la source
mysql_escape_string
sans connexion (essayant toujours de comprendre pourquoi). Puisque cette fonction est obsolète, je me demande simplement comment je peux la remplacer. Il semble certainement raisonnable que l'on puisse spécifier le "jeu de caractères approprié" dans n'importe quelle fonction qui le remplace sans ouvrir de connexion.Eh bien, selon la page de référence de la fonction mysql_real_escape_string : "mysql_real_escape_string () appelle la fonction de bibliothèque de MySQL mysql_real_escape_string, qui échappe les caractères suivants: \ x00, \ n, \ r, \, '," et \ x1a. "
Dans cet esprit, la fonction donnée dans le deuxième lien que vous avez publié devrait faire exactement ce dont vous avez besoin:
la source
mb_strpos()
(etmb_substr()
de créer un comportement similaire àsubstr_replace()
) pour faire cela?En opposition directe à mon autre réponse, cette fonction suivante est probablement sûre, même avec des caractères multi-octets.
J'espère que quelqu'un de plus compétent que moi pourra me dire pourquoi le code ci-dessus ne fonctionnera pas ...
la source
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é:
Une faille de sécurité d'injection SQL a été trouvée dans le traitement de codage multi-octets. Le bogue était dans le serveur, analysant incorrectement la chaîne échappée avec la fonction API C mysql_real_escape_string ().
Cette vulnérabilité a été découverte et signalée par Josh Berkus et Tom Lane dans le cadre de la collaboration de sécurité inter-projets du consortium OSDB. Pour plus d'informations sur l'injection SQL, veuillez consulter le texte suivant.
Discussion. Une faille de sécurité d'injection SQL a été trouvée dans le traitement de codage multi-octets. Une faille de sécurité d'injection SQL peut inclure une situation dans laquelle, lorsqu'un utilisateur a fourni 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 exécutera. En ce qui concerne cette vulnérabilité, lorsque l'échappement sans prise en compte du jeu de caractères est utilisé (par exemple, ajoute des barres obliques () 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 addlashes () ne peut pas empêcher les attaques par injection SQL. Il est impossible de résoudre ce problème côté serveur. La meilleure solution est pour les applications d'utiliser l'échappement sensible au jeu de caractères offert par une fonction telle que mysql_real_escape_string ().
Cependant, un bogue a été détecté dans la façon dont le serveur MySQL analyse la sortie de mysql_real_escape_string (). En conséquence, même lorsque la fonction de jeu de caractères mysql_real_escape_string () était 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 le correctif du bogue dans l'analyse mysql_real_escape_string (), mais que vous exécutez MySQL 5.0.1 ou supérieur, 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 actuelle, entrez l'instruction SQL suivante:
Vous pouvez également définir le mode globalement pour tous les clients:
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 , selon votre système). (Bogue n ° 8378, CVE-2006-2753)
Voir aussi le bogue # 8303.
la source
NO_BACKSLASH_ESCAPES
introduit d'autres vulnérabilités .