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\r\n";
//////ici on détermine le mail en format texte
//$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n"; ligne
neutralisée
$headers .= "Content-type: text/plain; charset=UTF-8\r\n";
////ici on détermine l'expediteur et l'adresse de réponse
$headers .= "From: $nom <$mail>\r\nReply-to : $nom <$mail>\nX-Mailer:PHP";
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";
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";
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";
-- <|[;o)) METIS http://www.graphM.com Pour m'écrire en privé, moi c'est metis15 et je tourne à l'Oranges...
METIS
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); ----------------------------------------------------------
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...
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);
----------------------------------------------------------
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); ----------------------------------------------------------
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 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.
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.
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 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.
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.
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
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 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...
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 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.
<cit.> $nom=$HTTP_POST_VARS['nom']; </cit.>
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é.
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=moi@machin.fr;
Je suppose que c'est une grosse connerie..?
Oui.
<cit.>
$nom=$HTTP_POST_VARS['nom'];
</cit.>
Ici, un attaquant peut faire en sorte que ceci soit équivalent à :
$nom="coucou@example.comrnTo: ... 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.
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.
<cit.> $nom=$HTTP_POST_VARS['nom']; </cit.>
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 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 ?
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 ?
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
Olivier Miakinen wrote:
Le 09/12/2008 10:55, METIS a écrit :
...
Je suppose que c'est une grosse connerie..?
Oui. <cit.> $nom=$HTTP_POST_VARS['nom']; </cit.>
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...
Olivier Miakinen wrote:
Le 09/12/2008 10:55, METIS a écrit :
...
Je suppose que c'est une grosse connerie..?
Oui. <cit.>
$nom=$HTTP_POST_VARS['nom'];
</cit.>
Ici, un attaquant peut faire en sorte que ceci soit équivalent à :
$nom="coucou@example.comrnTo: ... 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...
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
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.
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=moi@machin.fr;
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.
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.