Sécurité : magic_quote_gpc et base de données [Résolu]

Signaler
Messages postés
8
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
13 mai 2012
-
dgdf
Messages postés
8
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
13 mai 2012
-
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

Messages postés
14671
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 avril 2020
139
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
Messages postés
14671
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 avril 2020
139
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
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
10
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 !
Messages postés
8
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
13 mai 2012

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,
Messages postés
8
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
13 mai 2012

Merci beaucoup pour ta réponse ! C'est désormais très clair. Enfin ...

Le sujet est résolu.