2011-12-08 4 views
0

J'essaie d'éviter les injections sql.
Pour cela j'utilise mysql_real_escape_string().mysql_real_escape_string() Comportement différent avec guillemet simple

Sur mon serveur local (phpversion 5.3.2):

$string="a'b" 
$newstring=mysql_real_escape_string($string); 

query("INSERT INTO .. ..field1='$newstring'");

Insertion nouvelleChaine $ dans la table met "a'b".
Sur un autre serveur (phpversion 5.2.10) il place "a \ 'b" dans la table. Comment puis-je permettre l'insertion de «a'b» et éviter les injections?
Je ne souhaite pas modifier le fichier INI et les magic_quotes car cela peut affecter d'autres requêtes.
Je ne peux pas utiliser add_slashes car je devrai chercher toutes les utilisations de la valeur pour supprimer les barres obliques.

+0

mais les guillemets magiques sont désactivés sur un serveur et désactivés sur l'autre? –

Répondre

0

Si magic_quotes_gpc est activé, appliquez d'abord stripslashes() aux données.L'utilisation de cette fonction sur des données déjà échappées permet d'échapper deux fois les données.

if(get_magic_quotes_gpc()) { 
    $newstring = stripslashes($newstring); 
} 
+0

La * meilleure chose *, cependant, serait de désactiver complètement les citations magiques. C'est une chose du passé. –

+0

Que faire s'il n'a pas les droits de modifier la configuration php du serveur? –

+0

a bien fonctionné pour moi, maintenant la question est: "Est-il sécuritaire d'utiliser ceci et mysql_real_escape_string?" – lvil

0

Le problème le plus probable est que vous avez activé magic_quotes sur un serveur, mais pas sur l'autre. Soit magic_quotes désactiver ou modification du code:

$example = stripslashes($_POST['example']);  //undoes the magic_quotes 
$escaped_string = mysql_real_escape_string($example); //escapes it properly. 

Un scénario moins probable peut se produire si vous avez 2 connexions à 2 serveur de base de données différentes

mysql_real_escape_string fonctionne différents en fonction de la connexion que vous avez ouvert.
Si vous avez plusieurs serveurs et donc plusieurs connexions, vous devez exécuter la fonction d'échappement une fois par connexion.

Exemple

$example = "a'b"; 
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password'); 
$escapedstringA = mysql_real_escape_string($example, $connectionA); 
$escapedstringB = mysql_real_escape_string($example, $connectionB); 

Si vous laissez le paramètre de connexion dans l'appel à mysql_real_escape_string les deux escapedstrings seront échappés en utilisant l'encodage par défaut de remotehost, ce qui est incorrect.

Ce code peut fonctionner incorrect:

$example = "a'b"; 
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password'); 
$escapedstringA = mysql_real_escape_string($example); //uses remotehost's encoding 
$escapedstringB = mysql_real_escape_string($example); 
+0

Wut? Si 'a'b' se transforme en' a \ 'b' dans la table, cela n'a rien à voir avec 'mysql_real_escape_string()'. –

+0

@Pekka, je crois qu'il peut ** si ** vous réutilisez une valeur échappée dans un mauvais encodage sur un serveur avec un encodage très différent, relisant la question, je suis d'accord qu'il est beaucoup plus probable que c'est l'horrible ' magic_quotes' – Johan

0

Cela n'a probablement rien à voir avec mysql_real_escape_string(), mais votre réglage magic_quotes.

La chose serait préférable de tourner des guillemets magiques, as even the PHP manual itself recommends.

Si tel est vraiment pas possible, here est un exemple comment les guillemets magiques « désactiver » à partir de l'intérieur du code PHP.

0

Il est en effet des citations magiques c'est le problème. La seule chose que vous pouvez faire est de détecter les routes magiques et de supprimer les barres obliques. Theres quelques scripts que vous pouvez simplement laisser tomber en place qui fonctionnera globalement

contrôle les commentaires ici

http://php.net/manual/en/security.magicquotes.disabling.php

Si vous ne voulez pas utiliser ,, il globalement la condition if et la bande des barres obliques juste sur ce variable

0

J'essaie d'éviter les injections sql.
Pour cela j'utilise mysql_real_escape_string().

Regardez cette question, il pourrait être intéressant pour vous: Apparently there is an SQL injection bug in my PHP code

En bref, "utilisation mysql_real_escape_string" ne suffit pas à "éviter les injections sql". Il est utile uniquement pour les chaînes, mais pour les autres parties, vous avez besoin d'une approche différente. Reportez-vous à ma réponse précédente sur le sujet pour tous les détails: https://stackoverflow.com/a/2995163/285587