Encodage des caractères exotiques

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Encodage des caractères exotiques

Re: Encodage des caractères exotiques

par amateur php » 27 oct. 2009, 19:33

<?php
echo (htmlspecialchars(html_entity_decode($chaine)));
?>
Merci je me suis inspiré de ton code :
echo str_replace("&","&",htmlspecialchars(($chaine)));
Le str_replace c'est obligé car htmlspecialchars() remplace le & par &amp et le code html n'est plus bon. Je le re-remplace donc avec str_replace!
Et parfait pour les tag html (<script> etc) il les parse bien :)
Pas très propre mais ca marche ;)

Autre question, maintenant que mon affichage html est correct, comment faire pour rentrer en bdd le triangle en question, et non son code html ?
Car pour l'instant je rentre simplement l'input de l'utilisateur en base (avec bien sur qq securités sur les injections).
Que dois-je faire pour qu'en bdd je n'ai pas le code html du triangle enregistré mais bien le triangle en lui meme ?

Merci.

Re: Encodage des caractères exotiques

par Kran » 26 oct. 2009, 15:31

ou tu peux... réencoder uniquement les caractères correspondant à des balises html en utilisant la fonction htmlspecialchars !
<?php
echo (htmlspecialchars(html_entity_decode($chaine)));
?>
Bon ça commence à faire beaucoup de codages / décodages mais ça va fonctionner ^^

Sinon tu peux utiliser la fonction strtr au lieu de htmlentities ou htmlspecialchars pour choisir par toi même les caractères à encoder ou non en lui passant un tableau à ta sauce...
Pour éviter de te retapper toutes les conversions, tu pourrais par exemple récupèrer un des tableaux de correspondance déja existants avec la fonction get_html_translation_table et bidouiller en faisant sauter (unset) quelques entrées au passage ^^

Re: Encodage des caractères exotiques

par amateur php » 26 oct. 2009, 10:23

En effet il y a certains caractères exotiques que je n'accepte pas par sécurité, mais pour mon triangle ci dessus, il n'est pas méchant je ne vois pas comment le faire :/
Pour html_entity_decode() c'est bien ca qu'il me faut oui, l'algo serait comme cela alors ? :
- recupération du code html de la bdd,
- html_entity_decode() ce code
- affichage

Dans ce cas là mon triangle sera bien affiché en tant que triangle et pas code html. Parfait.

Mais si l'utilisateur rentre "<h1>test</h1>" par exemple, le html_entity_decode() va l'interpréter.. dans ce cas il faut que j'utilise htmlentities().
Je peux donc coder une ptite fonction genre :
function choisi_entite_html($txt){
 if(eregi("<",$txt) || eregi(">",$txt) )  // si on des balises html
     return htmlentities($txt);
  else 
    return html_entity_decode($txt);
 }
Cela pourrait résoudre mon problème ?

Re: Encodage des caractères exotiques

par Aureusms » 26 oct. 2009, 10:02

Salut,

Pour répondre à ta réponse, sans être paranoïac (lol) : il y a des méchants clients... Moi je préfère autoriser certains caractères au lieu d'autoriser tout. Après tout tu fais ce que tu désires. Pour preuve j'ai eu 4 tentatives d'intrusion la semaine dernière (par jour). Et à mon avis c'est peu...
Concernant ton issue du problème as tu essayer la fonction inverse de htmlentities qui est html_entity_decode() ?

Tu peux l'utiliser comme cela :
<?php
echo (html_entity_decode($chaine));
?>

Re: Encodage des caractères exotiques

par amateur php » 26 oct. 2009, 09:56

SAlut,
Merci pour ta réponse. Mais si j'ai bien compris toi à ma place tu refusera les caractères exotiques c'est ca ?
En fait je veux les garder ! Je veux que tout ce qu'affiche l'utilisateur soit inscrit en base puis réafficher. 'le client est roi" je ne peux pas lui supprimer ses commentaires ;)
Le problème est donc d'afficher ce caractère exotique sans afficher son code html associé!

Re: Encodage des caractères exotiques

par Aureusms » 26 oct. 2009, 09:23

Par sécurité j'ai utilisé la fonction htmlentities() afin d'éviter le xss (balise script etc).

C'est bien utilise aussi add_slashes() ou son équivalent (mysql_...) pour protéger des injections sql.

Mon problème survient quand un utilisateur rentre un caractère exotique, comme par exemple le caractère "▶" (code html : & #9654; qui est un triangle).
Mais comme j'utilise htmlentities() mon triangle devient le code html associé (& #9654;), or moi je veux qu'il affiche le triangle, je dois donc enlever mon htmlentities() : c'est la seule solution ?

Ensuite, enregistrement en bdd de ce triangle. Manque de bol encore une fois ce qu'il enregistre en bdd c'est le code html du triangle et non le triangle en lui même.. Quand je vais ensuite récupérer l'enregistrement pour l'afficher, je récupère le code html (logique), je l'affiche et pour qu'il redevienne triangle il faut encore une fois que je n'utilise pas htmlentities() => problème de sécurité..
Par contre, si je rentre à la main (c.a.d. dans le formulaire de phpmyadmin) mon triangle, il l'enregistre bien en tant que triangle, mais quand je le récupère en php ensuite et que je l'affiche, j'ai un "?" à la place de mon triangle..


Ce que tu peux faire :
Tu valides l'enregistrement de ta chaine envoyée (exotique ou non) avec htmlentities et tu l'enregistres dans ta base de données. Ensuite tu interroges tout de suite ta base de donnée et tu affiches grâce à html_entity_decode() ta chaine fraichement enregistrée. Ainsi, si ta chaine envoyée n'est pas conforme à ce que tu veux, de ce fait, tu ne l'enregistres pas et tu affiche un message d'erreur.
Pour terminer : avant l'enregistrement, je te conseil de "tester" la chaine envoyée via les REGEX. C'est un peu dur au début mais après quel bonheur...

Re: Encodage des caractères exotiques

par fab » 26 oct. 2009, 05:05

PhpMyAdmin t'affiche le code HTML tel quel oui c'est normal et c'est volontaire afin de voir ce que contient vraiment le champ cependant si tu affiches le contenu du champ dans une page celà va t'afficher ton triangle comme il faut !

Encodage des caractères exotiques

par amateur php » 26 oct. 2009, 00:49

Bonjour à tous,

Voilà je suis confronté à un problème d'encodage des caractères..
Je développe un site qui fait ceci (grossièrement) :
- le visiteur rentre un mot dans un formulaire (genre commentaire), je le ré affiche sur la page pour qu'il vérifie que c'est bon (prévisualisation),
- je stocke ensuite cet input en bdd, et il pourra être ressorti (affiché sur une page) à un moment donné.

Par exemple, un visiteur rentre "toto", envoie le formulaire, j'affiche "vous avez entré 'toto'".
Je stocke "toto" en base de données. Et ensuite une autre page affichera les 50 derniers mots entrés, donc "toto" apparaitra.
Si on prend des caractère alpha-numériques pas de problème.
Par sécurité j'ai utilisé la fonction htmlentities() afin d'éviter le xss (balise script etc).

Mon problème survient quand un utilisateur rentre un caractère exotique, comme par exemple le caractère "▶" (code html : & #9654; qui est un triangle).
Mais comme j'utilise htmlentities() mon triangle devient le code html associé (& #9654;), or moi je veux qu'il affiche le triangle, je dois donc enlever mon htmlentities() : c'est la seule solution ?

Ensuite, enregistrement en bdd de ce triangle. Manque de bol encore une fois ce qu'il enregistre en bdd c'est le code html du triangle et non le triangle en lui même.. Quand je vais ensuite récupérer l'enregistrement pour l'afficher, je récupère le code html (logique), je l'affiche et pour qu'il redevienne triangle il faut encore une fois que je n'utilise pas htmlentities() => problème de sécurité..
Par contre, si je rentre à la main (c.a.d. dans le formulaire de phpmyadmin) mon triangle, il l'enregistre bien en tant que triangle, mais quand je le récupère en php ensuite et que je l'affiche, j'ai un "?" à la place de mon triangle..

Bref, je suis perdu, je ne sais pas comment gérer ces caractère exotiques, car si je dois enlever les htmlentities() pour que ces caractères s'affichent bien, j'ai un problème de sécurité, mais si j'utilise htmlentities(), tous mes caractères exotique ne seront que des codes html.. #-o

En espérant avoir été clair,
Merci de vos conseils.