problème avec les accents dans un envoi d'email par PHP

Le
METIS
Bonjour,
Bon, désolé, on en a déjà parlé mais moi, le soudoué du code, j'y arrive
pas.
Avec le code ci-dessous, je me fais envoyer un formulaire en PHP (récupéré
je ne sais plus où).
Le problème, c'est que les accents donnent
Nathalie Mazé dans le champ De de l'email reçu
et dans l'email lui même, j'ai comme résultat soit
Téléphone : téléphone
soit
Téléphone : téléphone
en fonction de ce que je mets dans la ligne :
$headers .= "Content-type: text/plain; charset=UTF-8";

Comme je n'y connais que couic, c'est au pif.
Et au pif, après 36 essais, j'arrive à rien.

Merci à celui qui m'aidera et merci à ceux qui supportent ma nullité
indécrotable.

code

<?php
extract($_POST,EXTR_OVERWRITE);
if(isset($_POST['captchaResult']))
{
session_start();
$_POST['captchaResult'] = strtolower($_POST['captchaResult']);
$_SESSION['captchaResult'] = strtolower($_SESSION['captchaResult']);
if($_POST['captchaResult'] $_SESSION['captchaResult'])
{ //captcha OK on envoi le message
$nom=$HTTP_POST_VARS['nom'];
$mail=$HTTP_POST_VARS['mail'];

/////voici la version Mine
$headers = "MIME-Version: 1.0";

//////ici on détermine le mail en format texte
//$headers .= "Content-type: text/plain; charset=iso-8859-1"; ligne
neutralisée
$headers .= "Content-type: text/plain; charset=UTF-8";


////ici on détermine l'expediteur et l'adresse de réponse
$headers .= "From: $nom <$mail>Reply-to : $nom <$mail>X-Mailer:PHP";

$subject="Stage 2009";
$destinataire="moi@machin.fr";

$body="Stage 2009Prenom + Nom : $nomSociete : $societePoste :
$posteAdresse : $adresseEmail : $emailTelephone : $telephone" ;
mail($destinataire,$subject,$body,$headers);
include("merci.php");
}
else
{
//captcha faux
include("erreur.php");
}
}
?>

--
<|[;o)) METIS
http://www.graphM.com
Pour m'écrire en privé,
moi c'est metis15 et
je tourne à l'Oranges
Vos réponses Page 2 / 5
Trier par : date / pertinence
METIS
Le #22062191
Pierre Goiffon wrote:

$headers .= "Content-type: text/plain; charset=UTF-8rn";


Votre code PHP récupère donc vraisemblablement des chaines en UTF-8,
donc 2 alternatives :
- vous convertissez vos chaines en ISO Latin-1 et envoyé vos mails en
Latin-1



J'ai mis une ligne :
$headers .= "Content-type: text/plain; charset=ISO Latin-1rn";

Ca fait ceci :

Nom : é (j'ai écrit "é")
Prénom : prénom
Email : test
Téléphone : test
Objet : test

Avec le champ De du post reçu qui fait é

Mais bon, j'ai encore merdé ?

--
<|[;o)) METIS
http://www.graphM.com
Pour m'écrire en privé,
moi c'est metis15 et
je tourne à l'Oranges...
METIS
Le #22062181
Olivier Miakinen wrote:
Avant que je ne me lasse complètement, tu dois aussi savoir dans quel


jeu de caractères se trouve le bout de code que tu as donné en tête de
fil, et l'indiquer clairement.

Ainsi, tu remplaceras :
----------------------------------------------------------
<?php
extract($_POST,EXTR_OVERWRITE);
----------------------------------------------------------

par :
----------------------------------------------------------
<?php
header('Content-Type: text/html; charset=UTF-8');
extract($_POST,EXTR_OVERWRITE);
----------------------------------------------------------

ou par :
----------------------------------------------------------
<?php
header('Content-Type: text/html; charset=ISO-8859-1');
extract($_POST,EXTR_OVERWRITE);
----------------------------------------------------------



Ca fait un email avec :
Contact JACbourse
Nom : é (j'ai écrit "é")
Prénom : é (j'ai écrit "é")
Email : test
Téléphone : test
Objet : test

Et le champ De écrit é

J'ai enlevé la ligne
$headers .= "Content-type: text/plain; charset=UTF-8rn";
plus bas, je suppose qu'il fallait ?

--
<|[;o)) METIS
http://www.graphM.com
Pour m'écrire en privé,
moi c'est metis15 et
je tourne à l'Oranges...
METIS
Le #22062171
Bruno Desthuilliers wrote:
Tu veux pas me donner l'adresse de ton formulaire, là ? Je connais
quelques spammeurs que ça intéresserait...



Sans compter qu'un peu plus bas, il y a l'adresse en clair de l'email
destinataire
$destinataire=;

Je suppose que c'est une grosse connerie..?

Bon, comment fait-on alors ?

--
<|[;o)) METIS [noncodeur]
http://www.graphM.com
Pour m'écrire en privé,
moi c'est metis15 et
je tourne à l'Oranges...
Olivier Miakinen
Le #22062161
Le 09/12/2008 10:40, METIS a écrit :

J'ai mis une ligne :
$headers .= "Content-type: text/plain; charset=ISO Latin-1rn";

[...]

Mais bon, j'ai encore merdé ?



Oui ! ;-)

Tu es en train de reproduire le bug de Knode qui a généré quelques
dizaines d'articles dans fr.usenet.8bits...

Restreins-toi donc à UTF-8 et ISO-8859-1, sans espace dans le nom, mais
avec un trait d'union pour UTF-8 et deux pour ISO-8859-1. Cela dit, ce
n'est pas ça qui provoque le problème que tu as : je vais tâcher de te
répondre sans une autre partie du fil plus appropriée.
Olivier Miakinen
Le #22062151
Le 09/12/2008 10:10, METIS répondait à Bruno Desthuilliers :

Tu veux pas me donner l'adresse de ton formulaire, là ? Je connais
quelques spammeurs que ça intéresserait...



Vous savez les garçons, vous êtes sympa, mais je suis allergique au code,
c'est pas nouveau et plutôt irrémédiable.



Alors dans ce cas, il n'y a qu'une seule réponse, mais je crois qu'elle
ne va pas te plaire :

*************************************************************************
Tu ne *dois* pas essayer d'utiliser la moindre commande d'envoi de
courrier. On aura beau tout t'expliquer, avec la meilleure volonté
du monde, il y aura fatalement un endroit qu'on n'aura pas vu parce
qu'on n'a pas de vue d'ensemble sur ton code, et tu as environ 99,9 %
de chances pour que ton formulaire serve à spammer la terre entière.
*************************************************************************

Je viens ici pour avoir de l'aide.
Je suis même prêt à payer s'il le faut.



C'est en effet la meilleure solution : payer quelqu'un qui viendra chez
toi, ou qui aura un accès direct à tes sources, à la configuration du
serveur (au moins en lecture), et qui saura faire ce qu'il faut. La plus
grande difficulté sera probablement de trouver quelqu'un qui soit digne
de confiance.

Donc soyons constructif, que faut-il pour que ça marche bien?
(;o)))



Le faire faire par quelqu'un de compétent, pas allergique au code, et
suffisamment au courant des différentes techniques de spam possibles
avec les formulaires pour blinder ton application.
METIS
Le #22062141
Olivier Miakinen wrote:
[...]
C'est en effet la meilleure solution : payer quelqu'un qui viendra
chez toi, ou qui aura un accès direct à tes sources, à la
configuration du serveur (au moins en lecture), et qui saura faire ce
qu'il faut. La plus grande difficulté sera probablement de trouver
quelqu'un qui soit digne de confiance.



OK, ok, je ne demande que ça, mais je ne vois personne pour me faire ça. Ca
se passerait par le net car je suis à 600 bornes de Paris.

Donc soyons constructif, que faut-il pour que ça marche bien?
(;o)))



Le faire faire par quelqu'un de compétent, pas allergique au code, et
suffisamment au courant des différentes techniques de spam possibles
avec les formulaires pour blinder ton application.



OK, sachant que je souhaite pouvoir utiliser un modèle adaptable à
différents sites hébergés sur différents serveurs. C'est jouable ?

--
<|[;o)) METIS
http://www.graphM.com
Pour m'écrire en privé,
moi c'est metis15 et
je tourne à l'Oranges...
Olivier Miakinen
Le #22062131
Le 09/12/2008 10:55, METIS a écrit :
Bruno Desthuilliers wrote:
Tu veux pas me donner l'adresse de ton formulaire, là ? Je connais
quelques spammeurs que ça intéresserait...



Sans compter qu'un peu plus bas, il y a l'adresse en clair de l'email
destinataire
$destinataire=;

Je suppose que c'est une grosse connerie..?



Oui.

$nom=$HTTP_POST_VARS['nom'];

Ici, un attaquant peut faire en sorte que ceci soit équivalent à :
$nom=": ... liste de 30 000 adresses à
spammerrnContent-Type: Multipart ...rnrn... contenu du spam...";

S'il se débrouille bien, il peut même masquer le contenu de $body que tu
as mis toi-même.

Bon, comment fait-on alors ?



On ne fait pas.

On fait faire par quelqu'un qui sait, ou on ne fait pas du tout. Ou
alors on s'arrange pour apprendre, mais pour cela il ne faut pas être
allergique au code.

Désolé.
Olivier Miakinen
Le #22062121
Le 09/12/2008 11:39, METIS a écrit :

Le faire faire par quelqu'un de compétent, pas allergique au code, et
suffisamment au courant des différentes techniques de spam possibles
avec les formulaires pour blinder ton application.



OK, sachant que je souhaite pouvoir utiliser un modèle adaptable à
différents sites hébergés sur différents serveurs. C'est jouable ?



Si tu dois y toucher, il vaudrait mieux que tu aies le courage de t'y
mettre et de comprendre par toi-même les dangers du format de courriel
et le moyen de les éviter. Il y a parfois des bribes d'information sur
fr.comp.lang.php mais malheureusement ça n'a pas fait l'objet d'une
entrée dans la FAQ. Peut-être sur fr.comp.securite ?
METIS
Le #22062101
Olivier Miakinen wrote:
Le 09/12/2008 10:55, METIS a écrit :


...
Je suppose que c'est une grosse connerie..?



Oui. $nom=$HTTP_POST_VARS['nom'];

Ici, un attaquant peut faire en sorte que ceci soit équivalent à :
$nom=": ... liste de 30 000 adresses à
spammerrnContent-Type: Multipart ...rnrn... contenu du spam...";

S'il se débrouille bien, il peut même masquer le contenu de $body que
tu as mis toi-même.



OK, ceci dit, 1/ il y a un captcha et 2/ le fichier qui envoie les infos
est en PHP pur, donc pas accessible par son adresse.
Je pense que les risques sont assez limités...?

Je connais effectivement un gars qui bosse sur les réseaux et qui me dit que
*tout* est possible, pour lui dans n'importe quel cas de figure. Alors bon,
si je résous mon problème d'encodage, pour le reste ça ne craint pas tant
que ça...

--
<|[;o)) METIS
http://www.graphM.com
Pour m'écrire en privé,
moi c'est metis15 et
je tourne à l'Oranges...
Bruno Desthuilliers
Le #22062091
METIS a écrit :
Bruno Desthuilliers wrote:
Tu veux pas me donner l'adresse de ton formulaire, là ? Je connais
quelques spammeurs que ça intéresserait...



Sans compter qu'un peu plus bas, il y a l'adresse en clair de l'email
destinataire
$destinataire=;



Ca on s'en fiche totalement - ce que tu comprendrais probablement si tu
avais la moindre idée de ce qu'est un script PHP.

Le problème n'est pas là, mais dans le fait que tu ajoutes directement
ce qui a été posté ($nom entre autres) dans les headers, sans faire le
moindre test de sanité. Si ton formulaire est en prod, il sert très
probablement *déjà* à spammer la terre entière.

Je suppose que c'est une grosse connerie..?



D'avoir un formulaire mail qui sert de relais à spammeur ? A ton avis ???

Bon, comment fait-on alors ?




La solution usuelle consiste à rechercher la présence de "rn" et/ou
d'entêtes mails suspects dans les variables que tu récupères et que tu
veux passer dans les headers. Par expérience, le code suivant semble
fonctionner assez bien (mais il est sûrement possible de l'améliorer -
j'en profite d'ailleurs pour le soumettre à la critique impitoyable de
ce groupe...):

<?php
function check_headers($headers)
{
// recherche des newlines, éventuellement suivis d'entêtes mails
$bad = "/(%0A|%0D|\n+|\r+)(content-type:|to:|cc:|bcc:)?/i"
$is_suspect = FALSE;
$report = "";
foreach($headers as $header=>$value) {
if (preg_match($bad, $value) != 0) {
$is_suspect = TRUE ;
$report .= "header $header has newlines "
. " and/or mail headers : n---n $valuen---n"
;
}
}
// la plupart des navigateurs placent cet entête dans leur requête
// les scripts des spammeurs ne le font pas nécessairement...
if (empty($_SERVER['HTTP_USER_AGENT'])) {
$is_suspect = TRUE;
$report .= "empty user agent";
}

return $is_suspect ? $report : FALSE;
}

// ton code ici
// ...

$nom = $_POST['nom'];
$mail = $_POST['mail'];

// lister ici tous les champs à vérifier...
$unsafe_headers = array("nom"=>$nom, "mail"=>$mail);
$spam_report = check_headers($unsafe_headers);
if (! empty($spam_report)) {
// soit logger le rapport, soit l'envoyer par mail à l'admin,
// soit les deux....
// et surtout, ne *pas* continuer le traitement.
die();
}

// suite de ton code ici.
?>


Dernier point : on n'utilise *JAMAIS* directement la moindre variable
venant de l'extérieur - à moins bien sûr d'aimer se faire pirater d'une
façon ou d'une autre.
Publicité
Poster une réponse
Anonyme