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

Requêtes MySQL Discussion :

Échappement de valeurs avec mysql_real_escape_string


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 99
    Points : 46
    Points
    46
    Par défaut Échappement de valeurs avec mysql_real_escape_string
    Bonjour à tous,
    j'ai une petite question, j'ai un formulaire dans une page php avec un charset iso-8859-1.
    Je récupère toutes mes valeurs via $_POST et après vérification des champs, je les insère dans la bdd en les convertissant grâce à mysql_real_escape_string.

    Il transforme donc les ' en \' par exemple... le pb est que si je fais un SELECT afin d'afficher un enregistrement, je récupère bien entendu un enregistrement avec les backslash... Comment faire pour récupérer les enregistrements sans les caractères spéciaux, générés par real_escape_string?

    Exemple: la personne entre => l'amphi
    insertion dans la bdd => l\'amphi
    et après une requête select, je voudrais afficher => l'amphi et non l\'amphi

    Merci pour votre aide.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 99
    Points : 46
    Points
    46
    Par défaut
    personne pour m'aider?

  3. #3
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Salut,

    Il n'est pas normal que les valeurs dans ta base contiennent des caractères échappés (sinon imagine le souk pour faire un moteur de recherche par exemple).

    Peux-tu nous montrer un bout de ton code PHP qui insère la valeur d'une variable post dans la base ?
    Pensez au bouton

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 99
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par Maximilian
    Salut,

    Il n'est pas normal que les valeurs dans ta base contiennent des caractères échappés (sinon imagine le souk pour faire un moteur de recherche par exemple).

    Peux-tu nous montrer un bout de ton code PHP qui insère la valeur d'une variable post dans la base ?
    Salut maximilian,
    yes sans pb pour le code php..

    Je fais qqchose comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if(isset($_POST['submit']))
    {
      extract($_REQUEST);
      //Après je fais toutes mes vérifications de champs...
    }
     
    if(verif)
    {
      $query = "INSERT INTO ma_table(id, valeur) VALUES ('', '".mysql_real_escape_string($valeur)."');
      mysql_query($query);
    }
    Pour résumer, le champ s'appelle <valeur>, j'inscris dans mon champ le mot <l'amphi>.
    Après l'extract, je récupère bien <l'amphi> mais avec le real_escape_string, il écrit dans la bdd <l\'amphi>. Et quand je récupère ma <valeur> depuis la bdd, il m'inscrit <l\'amphi> alors que je voudrais qu'il m'affiche <l'amphi>

    Avant j'utilisais htmlentities mais j'ai lu que le real_escape était mieux pour lutter contre les sql injections.

  5. #5
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par alex75
    Et quand je récupère ma <valeur> depuis la bdd, il m'inscrit <l\'amphi>
    Comment la récupères tu ? On peut avoir un extrait du code ?
    Pensez au bouton

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 99
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par Maximilian
    Citation Envoyé par alex75
    Et quand je récupère ma <valeur> depuis la bdd, il m'inscrit <l\'amphi>
    Comment la récupères tu ? On peut avoir un extrait du code ?
    yep, excuse moi j'ai oublié de le mettre, je fais qqch comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $query = "SELECT * FROM ma_table WHERE id = 'mon_id'"
    $res = mysql_query($query);
    if($res)
    {
      $row = mysql_fetch_array($res);
      echo $row[1]; //affichage de ma valeur
    }

  7. #7
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Bizarre... normalement MySQL est censé se débarrasser des antislashes ajoutés par real_escape_string() (cf http://www.developpez.net/forums/vie...alescapestring).

    C'est peut-être un problème de configuration de PHP, je déplace dans le forum approprié...
    Pensez au bouton

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 99
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par Maximilian
    Bizarre... normalement MySQL est censé se débarrasser des antislashes ajoutés par real_escape_string() (cf http://www.developpez.net/forums/vie...alescapestring).

    C'est peut-être un problème de configuration de PHP, je déplace dans le forum approprié...
    Merci pour le lien, je test ce soir et je vous donne le résultat

    est ce peut être parce que je l'imprime comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo 'bonjour'.$valeur.', merci de votre inscription ...';
    Ce message est inclu dans un mail text/html - iso-8859-1

  9. #9
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Peut-être... Un moyen de vérifier serait d'exécuter la même requête mais dans un client MySQL classique pour voir ce qu'il affiche.
    Pensez au bouton

  10. #10
    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
    Ca vient surement de magic_quotes_gpc = on qui fait un addslashes automatique sur toute donnée qui arrive de l'exterieur. Il faut regarder l'exemple 3 de http://php.net/mysql_real_escape_string : il y a une fonction qui permet de s'affranchir de ce parametre

  11. #11
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    sinon en faisant un stripslashes($var) tu peux enlever les \ ajoutés par magic_quote_gpc.
    mais je te conseille si tu peux changer la config de php de mettre magic_quote_gpc à off plutot que de rajouter des stripslashes à chaque fois que tu veux recuperer une variable venant de ta bdd ^^

  12. #12
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    Citation Envoyé par loka
    sinon en faisant un stripslashes($var) tu peux enlever les \ ajoutés par magic_quote_gpc.
    mais je te conseille si tu peux changer la config de php de mettre magic_quote_gpc à off plutot que de rajouter des stripslashes à chaque fois que tu veux recuperer une variable venant de ta bdd ^^
    +1

    si tu ne peux pas le faire car sur un serveur mutualisé, sert toi de ini_set ou des directives apaches dans un htaccess
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  13. #13
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Citation Envoyé par siddh
    +1

    si tu ne peux pas le faire car sur un serveur mutualisé, sert toi de ini_set ou des directives apaches dans un htaccess
    ini_set ne servira pas à grand chose car les données sont déjà reçues au moment où ini_set sera exécuté.

    De plus, en ce qui me concerne, je conseille fortement l'utilisation de magic_quotes_gpc, ça permet d'éviter certaines infiltrations qui pourraient passer à cause de scripts pas assez rigoureux.

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Autre solution (déjà donnée dans un topic de ce forum sur la sécurité) : enlever les antislashs avant insertion en bdd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function proteger_injection_sql($donnee)
       //  suppression des slashes si magic_quotes_gpc est à 'on'
      {if (get_magic_quotes_gpc()) 
    		{$donnee = stripslashes($donnee);}
      // protection si ce n'est pas un nombre
      if (!is_numeric($donnee))
    		{$donnee = mysql_real_escape_string($donnee);}
     
    	return $donnee;
    	}

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 99
    Points : 46
    Points
    46
    Par défaut
    SUPER
    Merci à tous, l'exemple 3 du php marche nickel
    BRAVO et encore merci

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 99
    Points : 46
    Points
    46
    Par défaut
    j'ai peut être cliqué sur résolu un petit peu rapidement

    J'ai un petit problème qui persiste...
    Dans la bdd, nickel.
    Dans l'envoi de mail, nickel.

    Cependant, si l'utilisateur ne remplit pas bien un des champs, j'affiche un message d'erreur et laisse ses données dans chaque champ. Là surprise je retrouve avec des \' ... pourquoi? aucune idée...

  17. #17
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    ben il te manque le stripslashes
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 99
    Points : 46
    Points
    46
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Insertion dans la BDD, marche nickel
    $query = sprintf("INSERT INTO `carte` ( `id`, `nom`, `prenom`, `societe`,`support`, `mail`, `reponse`, `representant`, `telephone`)
    VALUES ('', %s, %s, %s, %s, %s, %s, %s, %s);", quoteSmart($nom), quoteSmart($prenom), quoteSmart($societe), quoteSmart($support), quoteSmart($email), quoteSmart($rep), quoteSmart($representant), quoteSmart($tel));
     
    ...
     
    //Construction du formulaire
    <input type="text" name="nom" value="<?php echo "$nom" ?>" size="40" maxlength="30" />
    Peut être que dans le formulaire je dois aussi mettre value="<?=quoteSmart($nom) ?>" ??

  19. #19
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    oui si ton quoteSmart fais un stripslashes
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 99
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par siddh
    ben il te manque le stripslashes
    Merci
    là en effet, ca marche nickel... mais je dois le mettre à chaque fois, c'est un peu redondant...
    Je suis hébergé sur netim donc j'ai pas accès au config php... enfin à ma connaissance, je me trompe peut etre?
    sinon, comment le faire via un .htaccess? J'y connais rien en .htaccess, désolé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input type="text" name="nom" value="<?=stripslashes($nom) ?>" size="40" maxlength="30" />
    [/code]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Pb index multi-valeurs avec DBase
    Par Rickless dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/01/2006, 16h50
  2. Réponses: 8
    Dernier message: 09/03/2005, 10h47
  3. [TP] Afficher une valeur avec outtext
    Par Bouilla dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/03/2005, 09h57
  4. [VB.NET] [ODBC] Récupérer des valeurs avec requête ODBC?
    Par Pleymo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/03/2005, 16h38
  5. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37

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