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

Langage PHP Discussion :

PDO, champ texte html, et échappement


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 38
    Par défaut PDO, champ texte html, et échappement
    Salut à tous,

    Je fais face à un problème d'échappement des caractères, que je n'arrive pas à résoudre. J'ai fait plusieurs recherches sur le net et sur ce forum, mais je n'ai rien trouvé qui correponde à mon problème (peut-être ai-je mal cherché... ).

    Bref, le problème est le suivant. J'utilise PDO pour un accès à une BDD MySQL. J'ai un formulaire HTML de champs texte qui, une fois envoyé par l'utilisateur, est enregistré dans la BDD. Si l'utilisateur revient sur la page de formulaire après avoir enregistré une première fois ses infos, les infos en question apparaissent directement dans les champs appropriés.

    Quand je veux écrire les données du formulaire dans la BDD (donc après validation de celui-ci) je prépare systématiquement mes requêtes. Mes magic_quotes sont à OFF, et le fait de préparer les requêtes m'évite d'avoir à faire des addslashes sur les données (si j'ai bien compris). De toute façon je n'ai pas de problème de ce côté-là.

    Par contre, quand je réaffiche la page avec des données déjà enregistrées, les simple quotes (et tout le texte qui les suit) disparaissent. Je prends un exemple si
    est enregistré dans la BDD, dans le champ texte, à l'affichage, j'aurai seulement
    ce qui se comprend, puisque le code PHP ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo("<input type='text' value='$ma_valeur' />\n");
    et le code HTML résultant ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type='text' value='J'aime les bananes' />
    J'ai tenté, au moment de l'affichage (dans la chaîne passée en paramère à echo) d'ajouter un htmlspecialchars(...., ENT_QUOTES) pour échapper le guillemet qui pose problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo("<input type='text' value='".htmlspecialchars($ma_valeur,ENT_QUOTES)."' />\n");
    L'affichage est alors correct, mais un autre problème se pose :
    Quand le formulaire est envoyé, n'est enregistré dans la BDD que ce qui précède le guillemet (même problème que j'avais à l'affichage avant d'ajouter le htmlspecialchars). Je pense que ça vient de la préparation des requêtes, qui tombe sur un truc html spécial (l'échappement du guillemet suite au htmlspecialchars) et qui prend peur, le prenant pour une tentative d'injection SQL.

    Seulement voilà, je ne sais pas comment faire pour avoir à la fois :
    - l'affichage correct de ce qui est enregistré en BDD dans le champ texte
    - l'enregistrement exact dans la BDD de cet affichage

    J'espère avoir été à peu près clair.
    Merci pour vos réponses !

    ++
    Charlock

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    htmlspecialchars ne fait pas d'echappement, elle convertir en entitées HTML.
    Si tu regardes ta source HTML, tu verras
    j&#039aime les bananes
    Par ailleurs la préparation des requêtes ne détecte pas les injections, elle sépare juste les valeurs du reste de la requête.

    Donc s'il y a un echappement qui s'introduit dans ta chaine, il vient d'ailleurs.
    Tu devrais contrôler ce que tu reçois exactement du formulaire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 38
    Par défaut
    Merci pour ta réponse. J'ai utilisé "échappé" à tort en voulant dire "transformé en HTML".

    Tu as raison, c'est bien "j&#039aime les bananes" qui apparaît sur le code HTML quand j'utilise htmlspecialchars.
    Par contre, ce que j'ai dit dans le précédent message reste vrai : l'enregistrement de ce truc là ("j&#039aime les bananes") dans la bdd donne seulement "j" et non "j'aime les bananes".

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu devrais contrôler ce que tu reçois exactement du formulaire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 38
    Par défaut
    Ok, erreur de manipulation, je suis un boulet...

    Le code html est bien modifié et apparaît avec &#039 mais dans la variable $_POST on retrouve l'apostrophe normal qui est donc bien enregistré tel quel dans la bdd.

    La solution est donc bien d'utiliser ce code PHP en parallèle avec les requêtes préparées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo("<input type='text' value='".htmlspecialchars($ma_valeur,ENT_QUOTES)."' />\n");
    Merci, sabotage, pour tes réponses !

Discussions similaires

  1. changer automatiquement la langue de saisie dans le champ text html(du français à l'arabe)
    Par than24 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 07/10/2012, 11h54
  2. [FLASH 8] Texte html dans champ texte dynamique
    Par bractar dans le forum Flash
    Réponses: 9
    Dernier message: 21/01/2007, 10h08
  3. [FLASH 8] Détecter le clique d'un lien : champs de text html
    Par CR_Gio dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 04/05/2006, 03h42
  4. [HTML] formulaire gérer les espaces dans un champs texte
    Par renofx1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 12/01/2006, 14h17
  5. recherche en texte libre dans des champs codés html
    Par boteha dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/12/2005, 22h26

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