Sécurité : magic_quote_gpc et base de données

Résolu
dgdf Messages postés 8 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 13 mai 2012 - 17 juil. 2011 à 11:06
dgdf Messages postés 8 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 13 mai 2012 - 17 juil. 2011 à 21:35
Bonjour à tous,

Je viens vers vous pour un pb de "magic quotes" ... Développeur PHP depuis un petit moment, je pensais avoir tout compris sur les magic quotes, mais là je ne suis plus sûr de moi.
Je travaille sur la migration d'une base de données vers mysql. D'après tout les sujets que j'ai pu lire sur les magic quotes, il est fortement conseillé de mettre magic_quotes_gpc à off, ainsi que magic_quotes_runtime. Ce que j'ai fait. Ensuite j'utilise une fonction appellée secure_var_insert() :

	function secure_var_insert($varInsert) {
if (get_magic_quotes_gpc()==1) {
return ($varInsert);
} else {
return (addslashes($varInsert));
}

pour chaque insert que je fais dans la base :

	 $variable0 = secure_var_insert($liste[0]); 
 $variable1 = secure_var_insert($liste[1]); 
 $variable2 = secure_var_insert($liste[2]);
 $variable3 = date("Y-m-d H:i:s",strtotime($liste[3]));
 	 $variable4 = secure_var_insert($liste[4]);
 $variable5 = date("Y-m-d H:i:s",strtotime($liste[5]));
 $variable6 = secure_var_insert($liste[6]);
 $variable7 = secure_var_insert($liste[7]);
 $variable8 = secure_var_insert($liste[8]);
 $variable9 = secure_var_insert($liste[9]);
 	 $variable10 = secure_var_insert($liste[10]);
 $variable11 = secure_var_insert($liste[11]);
 //$variable12 = transformerEnNomDeFichier($variable0);

echo $variable0."/".$variable1."/".$variable2."/".$variable3."/".$variable4."/".$variable5."/".$variable6."/".$variable7."/".$variable8."/".$variable9."/".$variable10."/".$variable11;

 /*Ajouter un nouvel enregistrement dans la table*/
 $sql = "INSERT INTO artiste (nom_artiste, bio_artiste, id_contact, type_contact, date_creation, date_fin, id_photo, ville, url_site_web, gestion_droit, nom_stockage, old_id_artiste, old_contact, old_style, old_manque) VALUES('$variable0','$variable1','','','$variable3','$variable5','1','$variable10','$variable11', '$variable6', '$variable0','$variable7','$variable2','$variable9', '$variable8')";

 $res = mysql_query($sql) or die(mysql_error());

 if ($res)
 {
echo "ligne $j (id=".mysql_insert_id()."): ok";
 }
 else {
echo "ligne $j : raté (".mysql_error().")";
exit();
 }


Tout ce code fonctionne bien. Par contre, ce que je n'arrive pas à comprendre, c'est que dans la base, aucun des caractères n'est échappé. Quand j'affiche à l'écran le contenu des variables après qu'elles soient passées dans la fonction secure_var_insert, pas de pb, les caractères sont bien échappés, tout se passe bien. Par contre ce qui est inséré dans la base, aucun caractère n'est échappé ... Ce n'est pas normal, tout devrait l'être normalement, non ?

Quelqu'un pourrait-il m'expliquer ?

Je vous remercie par avance pour vos réponses.

5 réponses

NHenry Messages postés 15117 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 10 mai 2024 159
17 juil. 2011 à 19:42
Bonjour,

Oui, dgdf, tu as bien compris mon message, tu visualises les chaines sans les échappements dans ta bdd..

Tu le faisais en double, d'où l'affichage, mais au moins, c'est mieux 2 que pas du tout :)
Il faut juste ensuite, penser à utiliser la réciproque pour récupérer la chaine originale.

Mon site
3
NHenry Messages postés 15117 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 10 mai 2024 159
17 juil. 2011 à 13:34
Bonjour,

Tout simplement, quand tu ajoutes par exemple :
"Mon Texte avec des ca'acte'es etranges"
Sera transformé en :
""Mon Texte avec des ca\'acte\'es etranges""
Quand tu ajoutes cela à ta requête, ça devient :
"INSERT INTO ... VALUES(..., '"Mon Texte avec des ca\'acte\'es etranges"', ...")

Donc tu insères les texte sans le formatage, le formatage sert juste à éviter une injection SQL.

Mon site
0
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
17 juil. 2011 à 16:25
bonjour
normalement en php5 c'est à off chez les hébergeurs actuels
mysql_real_escape_string protège des injections dans tout les cas
donc on evite ta méthode addslashes


/*on doit être connecte a mysql pour cette fonction*/




foreach($liste as $k => $v){
    $v=mysql_real_escape_string($v);
    liste[$k]=$v;
    }


   $variable0 = $liste[0]; 
...  
    
    
    $sql = "INSERT INTO artiste (
    
    nom_artiste,
    bio_artiste,
    id_contact,
    type_contact,
    date_creation,
    date_fin,
    id_photo,
    ville,
    url_site_web,
    gestion_droit,
    nom_stockage,
    old_id_artiste,
    old_contact,
    old_style,
    old_manque) 
    
    VALUES(
    
    '$variable0',
    '$variable1',
    '',
    '',
    '$variable3',
    '$variable5',
    '1',
    '$variable10',
    '$variable11',
    '$variable6',
    '$variable0',
    '$variable7',
    '$variable2',
    '$variable9',
    '$variable8'
    
    )";


et strip_slashes() en lecture pour enlever slash

Bonne programmation !
0
dgdf Messages postés 8 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 13 mai 2012
17 juil. 2011 à 18:29
Tout d'abord, grand merci à tous les deux pour avoir pris du temps pour me répondre.

Donc si j'ai bien compris, NHenry, quand je regarde directement dans ma base via phpMyAdmin, je dois voir le texte sans les échappements comme ceci : "Mon Texte avec des ca'acte'es etranges"

Si c'est bien ça, mon script fonctionne bien et j'évite les injections SQL. Par contre j'ai du me tromper précédemment sur d'autres applis, car je voyais en base les échappements. Cela veut dire que j'avais du laisser magic_quotes_gpc à on. Ceci dit pas de pb de sécurité, la sécurisation était plutôt faite en double alors.


cod57, l'hébergement est chez OVH, et en faisant un phpinfo(), les magic_quotes sont activées, ce qui m'a surpris d'ailleurs, je pensais comme vous qu'elles devaient l'être. Je les désactive donc par .htaccess on utilisant les directives suivantes :

SetEnv MAGIC_QUOTES 0

voilà voilà, encore merci d'avance pour vos réponses qui lèveront mes derniers doutes ...

Bien à vous,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dgdf Messages postés 8 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 13 mai 2012
17 juil. 2011 à 21:35
Merci beaucoup pour ta réponse ! C'est désormais très clair. Enfin ...

Le sujet est résolu.
0
Rejoignez-nous