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 :

[PHP-JS] htmlentities ne fonctionne pas après str_replace


Sujet :

Langage PHP

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Bon de toute façon je vois pas comment faire.

    Admettons que je ne passe par htmlentities() avant l'insertion dans la base.
    Premier problème : mon contenu ne veut pas rentrer dans le champ hidden, comme je l'ai dit il s'affiche.
    Déjà c'est réglé je suis obligé d'utiliser htmlentities().

    Admettons que je trouve une solution pour ça.
    Je fais quand même on str_replace avant l'insertion dans la base pour ne pas le faire à l'affichage. Au final dans la base je me retrouve simplement avec des <br> des <i> des <b> et des <a href> qui sont les balises que j'autorise. Elles ne sont pas converties donc c'est propres.

    Maintenant je dois faire htmlspecialchars à l'affichage pour éviter les bonnes blagues des membres et autres codes douteux.

    Bon et maintenant, ça va me les convertir mes balises susmentionnées. Par conséquent je suis bon pour un nouveau coup de str_replace() pour que toutes ces balises fassent leur effet sans quoi elles vont s'afficher sur l'écran du visiteur, puisqu'ayant été converties dans leur équivalent texte.

    Ou alors vous allez me dire que l'on peut exclure dans le htmlspecialchars() certaines balises ?

  2. #22
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    euh... quand on te dit de ne pas faire d'htmlspecialchars() sur tes données avant de les inserrer en base, ça veut dire que tu ne dois pas les modifier...

    tu peux parfaitement faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $a = '<a href="">';
    echo htmlspecialchars( $a );
    $requete = " insert into bidule values( '" . mysql_real_escape_string( $a ) ." ')" ;

    Mais pas ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $a = '<a href="">';
    $a = htmlspecialchars( $a );
    $requete = " insert into bidule values( '" . mysql_real_escape_string( $a ) ." ')" ;

    L'essentiel étant que ne modifies pas les données.

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Donc echo htmlspecialchars($a), ne modifie pas $a mais l'affiche modifié. C'est ça ? Bon admettons.

    Mais ça ne règle pas l'autre problème, concernant le BBCode.
    Comme j'ai dit si je le transforme par str_replace en bon code html avant l'insertion dans la base, mais sans faire aucun htmlspecialchars à ce moment là, alors je dois faire mon htmlspecialchars lors de l'affichage, comme vous le dites d'ailleurs.

    Bon, mais alors mon code html issue du BBcode est de nouveau convertie, et je n'ai plus qu'à refaire mon str_replace, ce qui coute des ressources.
    La seule solution que je vois c'est d'exclure de htmlspecialchars certaines balises.

    Une question pratique tiens, les forums phpBB convertissent le BBcode avant l'insertion ou lors de l'affichage ?

  4. #24
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    Citation Envoyé par psychoBob
    Donc echo htmlspecialchars($a), ne modifie pas $a mais l'affiche modifié. C'est ça ? Bon admettons.
    Exactement.


    Mais ça ne règle pas l'autre problème, concernant le BBCode.
    Comme j'ai dit si je le transforme par str_replace en bon code html avant l'insertion dans la base, mais sans faire aucun htmlspecialchars à ce moment là, alors je dois faire mon htmlspecialchars lors de l'affichage, comme vous le dites d'ailleurs.

    Bon, mais alors mon code html issue du BBcode est de nouveau convertie, et je n'ai plus qu'à refaire mon str_replace, ce qui coute des ressources.
    La seule solution que je vois c'est d'exclure de htmlspecialchars certaines balises.
    De toutes façons si tu affiches une page prévisualisation, c'est pour que l'utilisateur puisse modifier non ? Du coup, puisque l'utilisateur a de grandes chances d'avoir modifié sa saisie, tu es obligé de refaire ton traitement BBcode.



    Une question pratique tiens, les forums phpBB convertissent le BBcode avant l'insertion ou lors de l'affichage ?
    Aucune idée, mais dans tous les cas ce n'est pas forcément un bon exemple non plus... phpBB est loin d'être réputé pour ses performances, ni pour la propreté de son code, ni pour sa politique de sécurité d'ailleurs... en fait, phpBB ne plait qu'aux utilisateurs (et c'est déjà bien).
    Sans rentrer dans le troll, c'est un peu comme les vieux Windows : c'est mal fichu, pas pratique, lent, plein de faille. Mais c'est l'OS le plus répendu...

    Note : il s'agit d'un exemple, d'une illustration, pas la peine d'entrer dans une polémique là dessus...

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Citation:
    Mais ça ne règle pas l'autre problème, concernant le BBCode.
    Comme j'ai dit si je le transforme par str_replace en bon code html avant l'insertion dans la base, mais sans faire aucun htmlspecialchars à ce moment là, alors je dois faire mon htmlspecialchars lors de l'affichage, comme vous le dites d'ailleurs.

    Bon, mais alors mon code html issue du BBcode est de nouveau convertie, et je n'ai plus qu'à refaire mon str_replace, ce qui coute des ressources.
    La seule solution que je vois c'est d'exclure de htmlspecialchars certaines balises.

    De toutes façons si tu affiches une page prévisualisation, c'est pour que l'utilisateur puisse modifier non ? Du coup, puisque l'utilisateur a de grandes chances d'avoir modifié sa saisie, tu es obligé de refaire ton traitement BBcode.
    Non mais là je parle de l'affichage définitif du message, sur les pages dédiées à cet effet, après validation et tout. Donc le traitement du BBcode je le fais avant l'insertion dans la base. Et après, à l'affichage je passe le htmlspeciachars. Qui me casse toutes mes balises html issues de la conversion du BBcode. Donc je dois alors retraiter tout mon BBcode. Ou alors on peut exclure de htmlspecialchars certaines balises html, ce dont je doute du reste.
    C'est plus clair ?

  6. #26
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    ah ok j'y suis. Bah pour ma part le traitement qui se charge des BBCode est un traitement de "transformation en HTML", et à ce titre il produit du HTML, et on ne fait pas de htmlspecialchars() pour afficher du HTML...

  7. #27
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Non mais là ça va pas, je dois bien m'en servir de htmlspecialchars sinon on va m'afficher tout et n'importe quoi sur mon forum, scripts javascripts et compagnie.
    Bon donc je dois le filtrer à un moment ou un autre le message.
    Avant l'insertion vous voulez pas.
    Après l'insertion, mais alors ça me convertie mes balises html issues du bbCode convertie par str_replace() avant l'insertion dans la base.
    Donc j'ai plus qu'à repasser les str_replace() sur les balises html converties en texte pour les reconvertirs en <>.
    Or les str_replaces c'est avant l'insertion sans quoi on était à peu près d'accord, dans ma compréhension des choses, pour dire que ça c'est quand même trop long à faire lors de l'affichage, contrairement à htmlspecialchars qui est encore tolérable en terme de temps d'affichage.

  8. #28
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    Non : tu as un traitement de "transformation en HTML". Ce traitement est indissociable. Donc soit tu fais htmlspecialchars => bbcode => mysql, soit mysql => htmlspecialchars => bbcode ; mais évidement pas bbcode => mysql => htmlspecialchars...
    Sinon ça ne sert à rien le traitement bbcode a les mêmes défauts que le htmlspecialchars, à savoir qu'il dénature les données.

    Je précise d'autre part que pour moi c'est au "traitement bbcode" de s'assurer du travail de htmlspecialchars : si un jour tu veux ajouter des smileys avec ce code "; )" tu vas avoir plein de problèmes dans tes messages à cause de caractères "&eacute;" ou "&amp;" par exemple qui vont être changés en smileys...
    "bbcode" sert à changer du texte "brut" en HTML, et "htmlspecialchars" aussi... donc forcément, si tu utilises les deux cumulés, tu vas avoir des conflits.
    Mais ceci est un autre sujet

  9. #29
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Mouich
    tu fais htmlspecialchars => bbcode => mysql
    C'est ce que je fais hein... sauf que je rajoute un htmlspeciachars pour pouvoir faire entrer le contenu dans le texte hidden, mais comme tu l'as dis, je peux peut-être faire un simple echo htmlspecialchars($contenu).

    Bon allez zou ça fonctionne comme ça, on verra quand ça buggera. En tout cas j'ai appris des choses, merci

  10. #30
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    alors une dernière question, histoire de t'embèter : pourquoi diable mets tu le résultat de ton traitement d'affichage, qui ne sert donc qu'à l'affichage, dans un champ hidden ?

  11. #31
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    En fait ça se passe comme ça :

    1. Le gars clique "poster un commentaire"
    2. Il arrive sur une page avec un champ texte pour le titre et un textarea pour le contenu.
    3. Il clique prévisualiser.
    4. Une nouvelle page s'affiche:
    5. en haut son commentaire tel qu'il apparaitra.
    6. En dessous un bouton "envoyer".
    7. Encore en dessous son message dans le textarea. S'il le modifie, il reclique "prévisualiser", et ainsi de suite, il se réaffiche etc....
    8. Dans le code, le titre et le contenu sont dans des champs hidden, dans un form dont fait parti le bouton "envoyer".
    9. C'est ce form et ces champs hidden qui contiennent les données qui sont ensuite envoyées à la page d'insertion dans la base.
    (Il y a plein de vérifications, sur la taille des données, les grossièretés etc... mais je passe les explications).

    pourquoi diable mets tu le résultat de ton traitement d'affichage, qui ne sert donc qu'à l'affichage, dans un champ hidden ?
    Donc je le met dans un champ hidden pour l'envoyer à la page finale chargée d'insérer les données dans la base. Car j'ai deux forms sur la même page : un pour prévisualiser et un pour envoyer. Dans prévisualiser il y a les données en clair, prêtes à être modifiées, et dans le form avec le bouton envoyer, les données sont dans les champs hidden.

    Je sais pas si c'est clair comme ça mais en fait ça fonctionne très exactement comme n'importe quel forum (sauf qu'il n'y a pas de bouton pour envoyer directement les données, on est obligé de prévisualiser d'abord, mais bon...)

  12. #32
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    ok, je comprends bien.

    Maintenant qu'est ce qu'il se passe si je modifie le contenu du champ HIDDEN (oui oui, on peut), et que j'y met du code HTML... par exemple <h1>Hello</h1>, tu l'insère tel quel en base de données non ? et tu l'affiches tel quel également...

  13. #33
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ah ouais (très) bien vu, merci !

    Au début j'y avais pensé et puis j'ai planché sur les str_replace() et du coup j'ai déplacé l'endroit où j'effectue le filtrage...

    Bon j'ai plus qu'à m'y remettre, je vous tiens au courant...

  14. #34
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Bon voilà, ce coup ci je suis invulnérable, je met au défit n'importe quel hacker de l'école primaire de pirater mon site.

    Merci Kioob


    (cela étant maintenant c'est encore plus crade, j'ai deux fois des str_replace(), une fois pour l'affichage de prévisualisation, et une fois avant l'insertion finale dans la table, puisque mes balises sont pulvérisées par le htmlentities qui réceptionne les données du champs hidden. Mais bon, vaille que vaille on y arrive).

    En tout cas Kioob mérite une étoile au guide développez, il m'a évité la faille de poissard. Encore merci !

  15. #35
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    moarf, bah bon courage pour la suite

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. site ASP.NET/Silverlight ne fonctionne pas après publication
    Par TheBlackReverand dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 12/05/2009, 15h11
  2. gotoAndStop ne fonctionne pas apres modification d'un clip
    Par t_o_7_ dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 06/05/2009, 12h35
  3. Réponses: 4
    Dernier message: 06/08/2007, 16h17
  4. [PHP-JS] foreach qui fonctionne pas
    Par tiger63 dans le forum Langage
    Réponses: 4
    Dernier message: 06/04/2007, 15h49
  5. Réponses: 4
    Dernier message: 08/02/2007, 20h01

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