magic_quote et mysql_real_escape_string()

Eléphanteau du PHP | 27 Messages

06 avr. 2012, 14:19

Bonjour,

J'aimerais avoir confirmation pour un problème d'antislash qui devient visible après avoir utilisé mysql_real_escape_string($_POST['var']);

En local ça marche bien mais sur le serveur de mon hébergeur, je me retrouve avec les antislash en double. D'après ce que j'ai compris en parcourant le forum, magic_quote est activé dans la configuration de mon serveur distant et c'est donc l'usage de mysql_real_escape_string() qui provoque un doublage de l'antislash. Est-ce que j'ai bon jusqu'ici?

D'autre part je voudrais savoir, à mon avis oui, si je peux me passer de mysql_real_escape_string() sans provoquer de faille de sécurité (injections de code SQL).

Merci par avance,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 avr. 2012, 16:38

1/ l'inverse plutôt
2/ non surtout pas il faut utiliser mysql_real_escape_string !

Utiliser les magic_quote c'est une mauvaise idée vue que le système est supprimé de php5.4 (dernière version "majeure").

Regarde bien si toutes les directives magic_quote sont bien désactivées (dont les magic_quote_runtime).

Au pire dans l'etat des choses un stripslashes pour résoudre le problème à l'affichage pour le moment.
Mais suivant la configuration c'est \ peuvent être ajouté à l'insertion / mise à jour mais aussi à la récupération (ce qui fait que tu peux te retrouver avec une tonne de \ qui ce suivent ....).

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 27 Messages

06 avr. 2012, 22:57

D'accord, je vois. C'est donc une question à voir avec mon hébergeur ça, plutôt. Ou alors stripslashes.
Très bien, merci beaucoup!

ViPHP
AB
ViPHP | 5818 Messages

07 avr. 2012, 17:51

Si tu n'arrive pas à changer les paramètres de ton hébergeur tu peux toujours créer une petite fonction qui te permettra de travailler quelque soit la configuration du serveur :
function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);

return $chaine;
} 


$var = Verif_magicquotes($_POST['var']);// supprime les slash si magic_quotes activé
$var = mysql_real_escape_string($var);// protection de la variable pour insertion en bdd

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 avr. 2012, 21:00

Perso j'ajouterai un test sur l'existant des fonctions pour éviter les déboires en cas de migration sur php 5.4 ;)

http://php.net/manual/fr/function.function-exists.php


@+
Il en faut peu pour être heureux ......

ViPHP
AB
ViPHP | 5818 Messages

10 avr. 2012, 17:52

Perso j'ajouterai un test sur l'existant des fonctions pour éviter les déboires en cas de migration sur php 5.4 ;)

http://php.net/manual/fr/function.function-exists.php


@+
Oui pourquoi pas, ce serait une bonne précaution. Cela dit d'après ce que j'ai compris cette fonction retournera toujours false avec php 5.4 et sans message d'erreur (pour compatibilité avec du code créé avec des versions antérieures).

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 avr. 2012, 22:10

Ha oui tiens même pas une tite erreur :/

Merci pour l'info
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 27 Messages

11 avr. 2012, 01:25

Merci beaucoup!

Je revenais justement pour poster une fonction de ce type qu'on m'a suggéré d'utiliser:
function gpc_addslashes($str) {
	if (get_magic_quotes_gpc()==1) { 
		return $str; 
	} else { 
		return mysql_real_escape_string($str);
	} 
}

ViPHP
AB
ViPHP | 5818 Messages

11 avr. 2012, 19:35

Merci beaucoup!

Je revenais justement pour poster une fonction de ce type qu'on m'a suggéré d'utiliser:
function gpc_addslashes($str) {
	if (get_magic_quotes_gpc()==1) { 
		return $str; 
	} else { 
		return mysql_real_escape_string($str);
	} 
}
NON ! C'EST PAS BON !!

moogli a insister sur le fait qu'il fallait - DANS TOUS LES CAS - utiliser mysql_real_escape_string or toi tu le conditionne au fait que get_magic_quotes_gpc() !=1.

Prends modèle sur mon exemple. Tu vois que dans ce cas on applique toujours mysql_real_escape_string : on enlève les slash avec stripslashes si get_magic_quotes_gpc est activé et l'on applique mysql_real_escape_string sur le résultat.

Eléphanteau du PHP | 27 Messages

13 avr. 2012, 00:09

Bon, je ne comprends pas bien pourquoi la fonction ci-dessus n'est pas une bonne méthode mais j'ai résolu la question d'une manière plus simple. J'ai réussi à désactiver les magic_quotes en insérant ce code dans le fichier .htaccess

Code : Tout sélectionner

php_value magic_quotes 0 php_flag magic_quotes off php_value magic_quotes_gpc 0 php_flag magic_quotes_gpc off
Voici un lien :
http://www.kavoir.com/2010/05/turn-off- ... ccess.html

ViPHP
AB
ViPHP | 5818 Messages

13 avr. 2012, 03:48

Bon, je ne comprends pas bien pourquoi la fonction ci-dessus n'est pas une bonne méthode mais j'ai résolu la question d'une manière plus simple. J'ai réussi à désactiver les magic_quotes en insérant ce code dans le fichier .htaccess
Bah je croyais avoir été assez clair dans mon explication.
Dans ta fonction, si get_magic_quotes_gpc()==1 on retourne la chaine sans traitement alors qu'on t'a dis plusieurs fois qu'il fallait appliquer mysql_real_escape_string sur les variables pour les insérer dans une requête. Et comme magic_quotes_gpc - qui est un addslashe automatique sur les variables gpc (soit les variables get, post et cookie) - fait double emploi avec "mysql_real_escape_string", on supprime son effet avec un stripslahes et ensuite on applique "mysql_real_escape_string" (toujours si magic_quotes_gpc est activé).

Enfin bon puisque tu as désactivé "magic_quotes_gpc" via le .htaccess tu n'auras plus de problème mais si tu voulais faire un code portable et compatible avec d'anciennes configurations (qui vont durer encore certainement plusieurs années surtout pour les hébergements gratuits des fournisseurs d'accès), la fonction que tu as donnée n'est pas bonne puisqu'elle prive de l'utilisation de mysql_real_escape_string si magic_quotes_gpc est activé (je sais plus comment te le dire).

Code : Tout sélectionner

php_value magic_quotes 0 php_flag magic_quotes off php_value magic_quotes_gpc 0 php_flag magic_quotes_gpc off
Oui c'est la syntaxe habituelle classique. Cela dit pour des serveurs mutualisés cela peut varier suivant les hébergeurs, par exemple chez ovh il faudrait écrire "SetEnv MAGIC_QUOTES 0". Pour dire qu'il vaut mieux se renseigner auprès de son hébergeur si ces lignes ne fonctionnaient pas (et parfois le .htaccess n'est même pas pris en compte).