Caractères illisibles suite à un formulaire de contact

Petit nouveau ! | 6 Messages

24 juil. 2007, 18:11

Salut tout le monde,

J'ai un petit soucis sur mon site avec le formulaire de contact.

Quand je reçois un email envoyé à l'aide de ce formulaire, les accents et les apostrophes sont remplacés par des chaines de caractères ce qui rend le message illisible.

Voici le code de ma page de traitement du formulaire:
<?php
$adresse="[email protected]";
$from="<nom>";
$from.=htmlentities($_POST['nom']);
$from.="<email>";
$from.=htmlentities($_POST['email']);
$sujet=htmlentities($_POST['sujet']);
$texte=htmlentities($_POST['texte']); 
if (mail($adresse,$sujet,$texte,$from))
header("Location: http://www.nic563.be/contact_ok.html");
else
header("Location: http://www.nic563.be/contact_no.html");
?>
Merci d'avance à ceux qui pourront m'aider à rendre ces mails lisibles...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 juil. 2007, 18:35

J'ai donné la réponse à thedesk qui a posé la même question dans le message juste en dessous...
une petite recherche personnelle avant de poster ne serait peut être pas superflue hmm ?

http://www.phpfrance.com/forums/voir_re ... php#204518
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 6 Messages

24 juil. 2007, 19:57

Salut Ryle,

Sois rassuré car j'ai déjà fait une recherche sur le sujet mais je n'ai pas trouvé la bonne solution.

J'ai donc supprimer la fonction "htmlentities" comme tu l'as préconisé dans l'autre sujet mais ça ne fonctionne toujours pas. Avant, le mot "sévère" donnait "s&Atilde;&copy;v&Atilde;&uml;re" et maintenant que j'ai supprimé "htmlentities", ça donne "sévère".

Si quelqu'un a une idée, je suis preneur...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 juil. 2007, 00:16

Problème d'encodage, tes accents sont ici codé en utf-8 et affichés en iso... il te faut donc préciser qu'il s'agit d'utf8 ou bien convertir tes chaines avec la fonction utf8_decode() :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 6 Messages

26 juil. 2007, 19:44

Merci beaucoup pour le conseil Ryle.

C'est nickel mais j'ai encore un problème car ça met une barre oblique devant les apostrophes. Par exemple, la phrase "t'es arrivé" donne "t/'es arrivé".

Voici le code PHP que j'ai actuellement:
<?php
$headers  = 'MIME-Version: 1.0' . "\r\n"; 
$headers = 'Content-type: text/html; charset=UTF-8' . "\r\n"; 
$adresse="[email protected]";
$from="<nom>";
$from.=utf8_decode($_POST['nom']);
$from.="<email>";
$from.=utf8_decode($_POST['email']);
$sujet=utf8_decode($_POST['sujet']);
$texte=utf8_decode($_POST['texte']); 
if (mail($adresse,$sujet,$texte,$from))
header("Location: http://www.nic563.be/contact_ok.html");
else
header("Location: http://www.nic563.be/contact_no.html");
?>
Si quelqu'un a une idée ce serait super !

Par ailleurs, j'avais vu sur un forum qu'en ajoutant la fonction "htmlentities" comme dans mon code de départ ça renforçait la sécurité. Est-ce vrai et pour quelles raisons ?

Merci d'avance...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 juil. 2007, 00:06

Alors pour les apostrophes backslashées, c'est probablement que les magick quotes sont activées sur ton serveur. Cela a pour effet de "protéger" les apostrophes et les guillemets en mettant un antislash devant afin que tu puisses les insérer directement dans ta base de données.

Dans ton cas, comme il n'y a pas d'insertion en base mais une utilisation directe dans un mail, il faut supprimer ces antislash qui ont été ajoutés par le serveur à l'aide de la fonction stripslashes() :)

Quant à l'utilisation de htmlentities() son but est uniquement de convertir les caractères spéciaux en entités html pour que le navigateur affiche le caractère correspondant sans interpréter le code éventuel. Ca peut effectivement être une forme de sécurité dans la mesure ou quelqu'un de mal intentionné pourrait mettre un code javascript dans ton formulaire, que le navigateur (ou le client de messagerie si le mail est envoyé en html) risquerait d'exécuter à ton insue. Avec cette fonction, son code apparaitrait en toute lettre mais ne serait pas interprété :)

Dans le même genre tu as strip_tags() qui retire purement et simplement toutes les balises html de la chaine au lieu de te les afficher. Après c'est selon les besoins. Dans ce forum par exemple, si tu met un bout de code html il est transformé avec htmlentities pour être affiché et pas interprété. Ici tu vois mon code en toute lettre et tu n'as pas d'alert box intenpestive qui s'ouvre : <script>alert('coucou');</script>
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 6 Messages

29 juil. 2007, 15:44

Super !!!

Ca marche parfaitement car tout est lisible dans le mail (aussi bien les accents que les apostrophes).

Je voudrais juste savoir comment ajouter la fonction htmlentities() dans le code pour augmenter la sécurité.

Voci le code que j'ai actuellement:
<?php
$headers  = 'MIME-Version: 1.0' . "\r\n"; 
$headers = 'Content-type: text/html; charset=UTF-8' . "\r\n"; 
$adresse="[email protected]";
$from="<nom>";
$from.=stripslashes(utf8_decode($_POST['nom']));
$from.="<email>";
$from.=stripslashes(utf8_decode($_POST['email']));
$sujet=stripslashes(utf8_decode($_POST['sujet']));
$texte=stripslashes(utf8_decode($_POST['texte'])); 
if (mail($adresse,$sujet,$texte,$from))
header("Location: http://www.nic563.be/contact_ok.html");
else
header("Location: http://www.nic563.be/contact_no.html");
?>
Si quelqu'un peut m'aider, je suis preneur...

Nicolas

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

29 juil. 2007, 15:58

et si tu regardais la doc associée, nous proposais quelque chose et éventuellement on confirmerait...

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 185 Messages

29 juil. 2007, 16:02

Je ne suis pas certain que dans ton cas il soit utile d'utiliser la fonction htmlentities puisque le message envoyé sera lu dans une boîte mail.

Par contre si ton formulaire de contact est censé s'afficher directement dans un navigateur tu pourras en effet avoir un code ressemblant à ceci :
$message = htmlentities($_POST['message']);
(Comme toujours, en espérant ne pas dire de bêtises). :)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

29 juil. 2007, 16:15

(Comme toujours, en espérant ne pas dire de bêtises). :)
C'est déjà fait en donnant la solution :wink: (... ou peut être pas... il est juste ce code ?)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 185 Messages

29 juil. 2007, 16:20

(Comme toujours, en espérant ne pas dire de bêtises). :)
C'est déjà fait en donnant la solution :wink: (... ou peut être pas... il est juste ce code ?)
Je ne sais pas, je n'ai pas vérifié, c'est juste ce que je serai tenté de faire si j'étais confronté au problème. :oops:

Donner la bonne réponse est une bêtise ? :roll:

Il va falloir préciser cela dans la charte du forum ! :lol:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

29 juil. 2007, 16:31

l'ésprit du forum est plus de guider vers la bonne réponse et non de la donner.
On retient mieux si on a cherché un peu pour avoir une réponse :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 5924 Messages

29 juil. 2007, 16:55

Tu verras, à la longue, si tu restes ici, tu en auras marre de voir les mêmes revenir avec des questions triviales dont ils n'auront manisfestement pas cherché la réponse auparavant …