IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[Conception] Echappement de caractères


Sujet :

PHP & Base de données

  1. #1
    Membre averti Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Points : 362
    Points
    362
    Par défaut [Conception] Echappement de caractères
    Bonjour,

    Petit problème avec stripslashes et addslashes.

    Mon objectif est d'afficher un formulaire avec un champ de texte contenant une chaîne de caractères issue d'une base de données, afin de permettre à l'utilisateur de modifier cette chaîne pour mettre à jour ce champ dans la base de données.

    Pour cela dans le code j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type='text' name='texte' value="".stripslashes($variable)."">
    Puis un peu plus loin je lance ma requête de mise à jour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $post_texte = addslashes($_POST['texte']);
     
    $sql_update = "UPDATE table SET var = '".$post_texte."' WHERE ...";
    $req_update = mysql_query($sql_update) or die('Erreur SQL : <br />'.$sql_update);
    Le problème c'est que dans le champ de texte du formulaire s'il y a une double cote, la chaîne de caractère s'arrête à celle-ci, bien que la chaine dans la base soit complète.

    Exemple : Soit la chaine suivante:
    Test de la chaine "chaine"

    Dans la base de données, celle-ci est bien sous la forme:
    Test de la chaine \"chaine\"

    Mais dans le champ de texte il s'affiche:
    Test de la chaine

    Je précise que tout fonctionne bien avec les simples cotes.
    Quelqu'un peut-il me dire comment faire pour prendre en compte les doubles cotes?

    Merci.

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Normalement dans ta base de données tu devrais avoir "chaine" et pas \"chaine\". En fait tu appliques deux fois addslashes de suite ce qui fait que tes données sont doublement échappées. (une fois à cause de magic_quotes_gpc=on et une fois avec addslashes)

    Ensuite, pour afficher dans un input, généralement je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    htmlentities($valeur, ENT_QUOTES)

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    En effet, le problème se situe à l'affichage : je présume que les guillemets de ta chaîne entrent en conflit avec les guilllemets qui délimitent la propriété "value" de ton <input type="text">.

    Au passage : jette un oeil sur mysql_real_escape_string() et ici :
    http://shiflett.org/archive/184


    [Edit]
    @Mr N. : Si si, il doit bel et bien avoir \"chaîne\" dans le champ de son tuple. Non, il n'applique pas 2 fois addslashes() mais bien une seule fois.

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Comment tu sais que addslashes n'a pas été appliqué deux fois ? Tu connais sa config ? Je parie qu'il a magic_quote_gpc = on donc addslashes + addslashes = 2 addslashes

    Et dans une base de données on ne se trimbale pas des caractères d'échappement qui servent seulement à construire une requête donc on ne doit pas avoir \" ou \' une fois les données dans la base.

    Donc le problème se situe à l"affichage *et* au stockage

  5. #5
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Oui, bon j'étais pas en forme. Certes, je ne connais pas sa config.

    Cela dit, il me semble que stripslashes() intervient systématiquement pour une raison simple : les antislashes sont bel et bien enregistrés dans la BDD.

    nicoaix n'a pas de \\\" dans sa base, c'est ce qui me fait dire qu'il n'a pas les magic quotes à ON.

  6. #6
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    je tape "chaine"                                                  ===> "chaine"
    magic_quotes_gpc                                                  ===> \"chaine\"
    addslashes                                                        ===> \\\"chaine\\\"
    construction de "UPDATE ... SET var = '\\\"chaine\\\"' WHERE ..." ===> UPDATE ... SET var = '\"chaine\"' WHERE ...
    dans la db                                                        ===> \"chaine\"
    C'est plus clair là :

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Hmmm, après tests, oui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE `test` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(25) NOT NULL default '',
      PRIMARY KEY  (`id`)
    )
    <?php

    mysql_connect
    ('localhost', 'root', '');
    mysql_select_db('test');

    $sql = 'INSERT INTO `test` (`name`) VALUES ("\'bouh\'")';

    mysql_query($sql)
    &#160;&#160;&#160;or die(
    mysql_error());

    $sql = 'SELECT `id`, `name` FROM `test` ORDER BY `id` DESC LIMIT 1';
    $result = mysql_query($sql);
    $row = mysql_fetch_assoc($result);

    echo
    $row&#91;'id'].' : '.htmlentities($row&#91;'name']);

    ?>
    Colorez votre code PHP sur les forums grâce à Developpez.com
    => 'bouh'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'INSERT INTO `test` (`name`) VALUES ("\\\'bouh\\\'")'
    => 'bouh'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'INSERT INTO `test` (`name`) VALUES ("\\\\\'bouh\\\\\'")'
    => \'bouh\'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO `test` (`name`) VALUES ('\'bouh\'')"
    => 'bouh'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO `test` (`name`) VALUES ("\\\'bouh\\\'")"
    => SQL syntax error

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO `test` (`name`) VALUES ("\\\\\'bouh\\\\\'")"
    => \'bouh\'

Discussions similaires

  1. Echapper des caractères avec VBA pour requete SQL
    Par mpereg dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/04/2008, 03h41
  2. Echapper un caractére + Lancer un script VBS
    Par FinalSpirit dans le forum WinDev
    Réponses: 6
    Dernier message: 01/10/2007, 13h46
  3. Echapper un caractère
    Par Invité dans le forum Langage
    Réponses: 18
    Dernier message: 14/09/2007, 14h37
  4. Echappement de caractères
    Par Mengué georges dans le forum JDBC
    Réponses: 1
    Dernier message: 31/05/2007, 17h03
  5. QueryString Echappement du caractère &
    Par lapanne dans le forum ASP
    Réponses: 2
    Dernier message: 12/03/2007, 10h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo