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 :

addslashes() stripslashes() et "" '' [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut addslashes() stripslashes() et "" ''
    bonsoir , je propose de prendre un champ titre.
    Le contenu du champ sera rempli dans un formulaire puis stocké dans une base de données et réaffiché.

    le titre serait par exemple!

    $titre => les "geeks" sont de retour.
    Je fais un addslashes avant de le rentrer dans ma BDD.
    $titre devient donc les \"geeks\"

    Ensuite quand je veux le reafficher , je fais un stripslashes.
    $titre devient les "geeks"

    Et le problème c'est si j'affiche ça dans un input text ca marche mal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo'<input type="text" value=" '.$titre.' ">';
    De même si j'ai des ' ' dans mon titre et utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo"<input type='text' value='$titre'>";
    Comment faire?
    merci

  2. #2
    Membre confirmé Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Points : 625
    Points
    625
    Par défaut
    Salut !

    si tu te connectes à une base mysql, tu devrais utiliser la fonction "mysql_real_escape_string()" qui protégera tes valeurs.

    au lieu de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $titre=addslashes($titre);
    tu feras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $titre=mysql_real_escape_string($titre);
    puis pour récupérer tes valeurs de la base et les afficher correctement, continues à utiliser Maintenant, tu ne nous as pas dis ce qu'était ton problème, alors un petit plus de précision nous aiderait.

  3. #3
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    voici la chaine de caractère "geek" .

    Dans mas base de données , elle sera stockée comme \"geek\" .

    si je vais l'afficher dans une zone de formulaire , là ça plante à chaque coup.

    car l'attribue devient soit value=""geek"" <- plantage
    soit value="\"geek\" <- plantage

    J'avoue ne pas voir de solution.
    L'affichage HTML ne se fait pas correctement car le " ferme le balise value.

  4. #4
    Membre confirmé Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Points : 625
    Points
    625
    Par défaut
    as-tu essayé la solution que je t'ai proposé ?
    pour l'affichage essais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo"<input type='text' value=$titre>";
    Sachant que en PHP les guillemets ( " ) permette d'afficher le résultat de la variable.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $a="salut";
    echo "$a Julien"; //renvoit : salut Julien
     
    echo '$a Julien'; //renvoit : $a Julien

  5. #5
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    je pense pas que ça respecte les normes du HTML ça.

    Si la variable est mise à vide .
    value = rien du tout .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $titre = "";
    echo"<input type='text' value=$titre>";
    <input type='text' value=> // respecte pas le HTML

  6. #6
    Membre confirmé Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Points : 625
    Points
    625
    Par défaut
    Ah bon ?

    donc pour toi il est interdit d'afficher un champs vide ?
    Ou alors j'ai mal compris ce que tu as dis

  7. #7
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    http://www.w3schools.com/xhtml/xhtml_syntax.asp

    Attribute Values Must Be Quoted

    This is wrong:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <input type ="text" value="" />
    <input type ="text" value=yesss/>

    This is correct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    <table width="100%" >
     
    <table width="100%" class="" >

  8. #8
    Membre confirmé Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Points : 625
    Points
    625
    Par défaut
    Mais au fait pourquoi veux-tu d'un coup que titre soit vide ??

    si tu veux pas ça fait :

    if($titre!="") { $titre="value=".$titre; }

  9. #9
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    ça ne marchera pas et de toute façon c'est plutôt du bidouillage...

  10. #10
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Salut,

    1) À mon avis, pour afficher des guillemets ou des apostrophes dans l'attribut d'une balise, une méthode propre et efficace serait de convertir ces caractères ' et " en code HTML.
    Pour cela, il y a la fonction htmlspecialchars(), dont les arguments à fournir sont ta chaîne de caractères et le paramètre ENT_QUOTES.

    Ainsi, le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<input type="text" value=" '.$titre.' ">';
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<input type="text" value="'.htmlspecialchars($titre, ENT_QUOTES).'">';
    2) Je ne vois vraiment pas l'utilité de la fonction stripslashes dans ton cas, vu que la base de données est censée contenir le texte tel qu'il a été saisi par l'utilisateur.
    Si tu dois quand même utiliser la fonction stripslashes pour afficher correctement les ' et ", c'est sûrement que tu as échappé les données à deux reprises avant enregistrement !

    Ce "double échappement" arrive fréquemment avec l'option magic_quotes_gpc activée dans ta configuration PHP, car ça permet d'ajouter automatiquement des antislashs dans les données issues des variables GET, POST et COOKIE.

    Pour reprendre ton exemple, si l'utilisateur tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    les "geeks" sont de retour
    Avec les magic_quotes_gpc activées, ça devient automatiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    les \"geeks\" sont de retour
    Si en plus, tu rajoutes la fonction addslashes ou mysql_real_escape_string, ça devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    les \\\"geeks\\\" sont de retour
    (Les anti slashs et et les " sont de nouveau échappés !)

    Au final, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    les \"geeks\" sont de retour
    qui sera enregistré dans ta base de données, ce qui te force à appliquer un stripslashes pour afficher correctement le texte issu de ta BDD.

    Évidemment, il FAUT ABSOLUMENT utiliser addslashes() ou mysql_real_escape_string() si l'option magic_quotes_gpc n'est pas activée (de toute façon je n'aime pas cette option... ça ne protège pas automatiquement de toutes les failles potentielles et ça donne un faux sentiment de sécurité aux débutants).
    Bon je sais c'est pas trop en rapport avec ton problème initial, mais je vois souvent ce genre de truc alors je tenais à faire la remarque

  11. #11
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    Merci voilà la réponse que j'attendais.
    C'est vrai que ça affiche pas ce qu'on voulait c'est à dire les "geeks" mais les 'geeks' mais ça affiche quelque chose d'intéressant.

    Dans ma base de données , "les geeks" est stocké de la façon suivante : \"les geeks\" (car et en sortie je fais un strip slashes et en entrée selon la valeur des magic quotes je fais un mysql_real_escape_thing ou pas).

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par Haze.
    Évidemment, il FAUT ABSOLUMENT utiliser addslashes() ou mysql_real_escape_string() si l'option magic_quotes_gpc n'est pas activée (de toute façon je n'aime pas cette option... ça ne protège pas automatiquement de toutes les failles potentielles et ça donne un faux sentiment de sécurité aux débutants).
    Entièrement d'accord sauf sur ce qui est dit de magic_quotes_gpc et addslashes : qu'il soit actif ou non, il est recommandé d'employer mysql_real_escape_string car cette fonction ne remplit, lorsqu'elle est active, que la moitié du boulot vu que c'est une fonction "générique" ne pouvant pas tenir compte des spécificités de chaque SGBD (ne pas oublier si elle est active de faire appel à stripslashes avant mysql_real_escape_string).

    Liens :


    Enfin si tous les traitements sont correctement effectués à l'insertion vous ne devriez pas avoir besoin de stripslashes lors de leur récupération.

  13. #13
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Citation Envoyé par cotede2
    C'est vrai que ça affiche pas ce qu'on voulait c'est à dire les "geeks" mais les 'geeks' mais ça affiche quelque chose d'intéressant.
    Hein ?! Si l'utilisateur tape des guillemets doubles, elles seront correctement restituées dans ton champ input, puisque transformées en code HTML (&quot; ).
    À l'affichage ton code HTML sera :

    <input type="text" value=" les &quot;geeks&quot; sont de retour" />

    @ julp :
    Ah oui, très juste comme remarque, je n'y avais pas pensé.
    L'exemple de la documentation PHP sur get_magic_quotes_gpc est contre-indiqué alors... du coupe j'aime encore moins cette option.
    Merci

  14. #14
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    donc ma base de données , je dois stocker sous quelle forme ?
    HTML &quot
    normal "" ?
    normal antislashé \"\" ?

    Sachant que je gère aussi toutes les langues (arabe , chinois ,suédois ...) .

  15. #15
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Citation Envoyé par cotede2
    donc ma base de données , je dois stocker sous quelle forme ?
    HTML &quot
    normal "" ?
    normal antislashé \"\" ?
    Ça, c'est à toi de voir.

    - Pour moi, c'est la deuxième option, car en théorie, la BDD contient les données telles qu'elles ont été saisies par l'utilisateur. Ça permet une plus grande flexibilité, car si tu enregistres dans ta BDD des données modifiées, et que tu décides un jour de modifier les traitements appliqués en entrée et/ou sortie, et bien il sera trop tard !

    - Pour la troisième option : si tes données sont enregistrées avec des antislahs, c'est que tu as fait un double échappement. Ça n'a vraiment aucun intérêt, en plus tu enregistres des caractères supplémentaires inutilement (cf. mon premier post et celui de julp à propos des magic_quotes_gpc)

    - Reste la première option, c'est à dire appliquer un htmlspecialchars() avant enregistrement.
    Les inconvénients sont le manque de flexibilité (cf. option 2) et tu enregistres beaucoup de caractères supplémentaires.
    Certaines personnes préfèrent quand même cette solution car le traitement est appliqué une seule et unique fois, alors qu'en sortie la fonction est appelée autant de fois que le texte est affiché. PHP économise donc quelques ressources avec cette méthode...


    M'enfin bref, la question de la forme d'enregistrement n'a aucun rapport avec ton problème, vu que tu cherches simplement à ré-afficher les valeurs saisies dans les champs après un envoi du formulaire ou une actualisation de la page (Je suppose que c'est au cas où le formulaire a mal été rempli et pour éviter à l'utilisateur de tout re-écrire ?).
    Il suffit de mettre la fonction dans le formulaire, comme je te l'ai indiqué dans mon premier post (et il n'y aucun enregistrement dans la BDD !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<input type="text" value="'.htmlspecialchars($titre, ENT_QUOTES).'">';
    Ensuite, indépendamment de ça, tu peux tout à fait choisir d'appliquer cette fonction aussi avant insertion dans la BDD, ou en sortie pour l'affichage, ou encore pas du tout si ça te chante

    Citation Envoyé par cotede2
    Sachant que je gère aussi toutes les langues (arabe , chinois ,suédois ...)
    À priori je pense qu'il n'y a pas de rapport, il suffit d'encoder tout en utf-8.

  16. #16
    Membre habitué
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Points : 178
    Points
    178
    Par défaut
    Si j'utilise un mysql_real_escape_string , tous mes " seront échappés et donc je devrais le stocker sous la forme \"les geeks\".

    Pour pouvoir les stockers sous forme originale , dirais je , le mieux serait donc de faire un htmlspecialchars avec le flag ENT_QUOTES sur la chaine et donc de stocker les " avec le code HTML correspondant? &quot;

    Concernant les caractères spéciaux , je peux laisser comme ils étaient sans convertir en HTML pour la base de données? puis en sortie les convertir en HTML .

  17. #17
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Citation Envoyé par cotede2
    Si j'utilise un mysql_real_escape_string , tous mes " seront échappés et donc je devrais le stocker sous la forme \"les geeks\".
    Non !
    L'échappement sert juste à sécuriser la requête SQL (pour y éviter des injections).
    Après échappement, $titre vaut
    C'est donc
    qui sera enregistré. Il faut comprendre que l'antislash est ici un caractère spécial, il sert juste à indiquer à PHP que le ' ou " ne marque pas la fin de la chaîne de caractères. MySQL n'enregistre donc pas les antislashs (c'est justement le principe de l'échappement). Si tu veux un antislash en tant que caractère, il faut l'échapper à son tour en mettant encore un ansitslash devant ( \\ ).
    Si $titre est enregistré dans ta BDD sous la forme
    Ça veut dire qu'il y a eu un double échappement, et que $titre vaut en réalité
    Fait un echo avant et après tes traitements, tu verras.
    Tu peux aussi utiliser la fonction get_magic_quotes_gpc(), afin de prévoir si les magic_quotes sont activées ou pas. Ça permet aussi de s'assurer que ton code marche toujours de la même manière, indépendamment de la configuration de PHP.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. addslashes / stripslashes en javascript
    Par the_jeck dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 24/03/2011, 14h44
  2. Réponses: 7
    Dernier message: 24/09/2005, 13h30

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