[RESOLU] addslashes-mysql_real_escape_string.......utilisation :(

Eléphanteau du PHP | 17 Messages

28 août 2015, 16:29

Pour insérer des données fournir par l'internaute dans la BDD, j'utilise mysql_real_escape_string. C'est ok, ca met les \ devant les guillemets simple ou double mais quand je veux afficher ces données, j'ai biensur ce petit \ qui apparait et ce n'est pas très esthétique :/ Une petite idée pour corriger ?

Mammouth du PHP | 2703 Messages

28 août 2015, 16:37

s'il y a un \, c'est qu'il a été ajouté 2 fois, donc, par exemple, qu'il ne faut pas utiliser mysql_real_escape_string

Eléphanteau du PHP | 17 Messages

28 août 2015, 17:03

Il apparait dans la BDD une seule fois et il est donc affiché qd je l'appelle dans un script. Ca je comprends. Si je ne mets pas de mysql_real_escape_string, c'est porte ouverte à tous à ma BDD, non ?
Donc, je ne mets pas en doute ce que tu me dis, mais j'essaie de comprendre et voudrais etre sure de bien t'interpreter : Comment peut il etre ajouter 2 fois ? Voici ma requête :
<?php
$sql = 'INSERT INTO reponses VALUES("", "'.mysql_real_escape_string($_POST['auteur']).'", "'.mysql_real_escape_string($_POST['message']).'", "'.$date.'", "'.$_GET['numero_du_sujet'].'")';
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
?>

Eléphanteau du PHP | 17 Messages

28 août 2015, 19:48

Trouvé : il suffit de mettre la fonction stripslashes devant les variables à afficher.

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

31 août 2015, 12:08

Bonjour,

En fait, le "\" ne devrait pas apparaître une fois la donnée enregistrée en base. Celui-ci doit uniquement servir à protéger les caractères spéciaux lors de l'exécution de la requête. Si en base de données tu vois apparaître la chaîne " L\'apostrophe ", c'est qu'au moment de l'insertion en base, la requête sql a utilisé la valeur " L\\\'apostrophe ", ce qui indique que ta chaîne a été protégée deux fois... protéger une chaîne c'est bien, mais là c'est un peu trop ;)

Pourquoi une double protection ? Parce que ton serveur php doit être dans une version <= 5.3 et configurée avec la directive magic_quotes_gpc à "on". Cette directive (qui a disparu avec php 5.4) protège automatiquement les variables que tu récupères via GET, POST, REQUEST ou COOKIES en faisant l'équivalent d'un addslashes(). Lorsque tu appelles mysql_real_escape_string() sur ces variables, tu doubles donc le traitement.

Pour éviter cela, le mieux est soit de désactiver cette directive et ne te fier qu'à ton code pour protéger les variables, ou si tu ne peux pas la désactiver, vérifier si celle-ci est active (get_magic_quotes_gpc()) et le cas échéant, en annuler les effets, de façon à ce que ton code puisse traiter les données telles qu'elles sont soumises (Il est par contre du coup indispensable de contrôler/protéger toutes les données transmises).

Pour plus d'information sur la directive en question :
http://php.net/manual/fr/security.magicquotes.what.php

L'avantage de ce fonctionnement plutôt que d'utiliser stripslahes à l'affichage, c'est que les données que tu as en base pourront servir à d'autres traitements que juste apparaitre sur une page php, et ne nécessiteront pas systématiquement d'être retraitées.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 17 Messages

31 août 2015, 14:12

Ohhhh !!!!! Bonjour et merci beaucoup pour ces précieuses informations ! Je vais regarder çà !