Page 1 sur 1

Caractères illisibles suite à un formulaire de contact

Posté : 24 juil. 2007, 18:11
par nic563
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...

Posté : 24 juil. 2007, 18:35
par Ryle
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

Posté : 24 juil. 2007, 19:57
par nic563
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...

Posté : 25 juil. 2007, 00:16
par Ryle
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() :)

Posté : 26 juil. 2007, 19:44
par nic563
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...

Posté : 27 juil. 2007, 00:06
par Ryle
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>

Posté : 29 juil. 2007, 15:44
par nic563
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

Posté : 29 juil. 2007, 15:58
par Truc
et si tu regardais la doc associée, nous proposais quelque chose et éventuellement on confirmerait...

Posté : 29 juil. 2007, 16:02
par Kaoteknik
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). :)

Posté : 29 juil. 2007, 16:15
par Truc
(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 ?)

Posté : 29 juil. 2007, 16:20
par Kaoteknik
(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:

Posté : 29 juil. 2007, 16:31
par Truc
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:

Posté : 29 juil. 2007, 16:55
par Sékiltoyai
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 …