Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Detournement de la fonction mail() par des spammeurs

7 réponses
Avatar
messian_nospam
Bonjour,

Mon serveur fait fréquemment l'objet d'attaque par des spammeurs qui
utilisent les formulaires contact.

J'utilise la class libmail de Léo West :
http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=fr

Toutes les variables utilisé par la classe libmail sont initialisées
dans mes scripts de la façon suivante :

$var1 = "" ;
$var2 = "" ;
$var3 = "" ;
...
$varN = "" ;

extract($_POST,EXTR_OVERWRITE);

Je peux faire quoi de plus ? Vérifier si la page d'où provient la
demande est bien celle qui contient mon formulaire ?



--
Un moyen de garde pour vos enfants ?
http://www.easynounou.com

7 réponses

Avatar
Olivier Miakinen

J'utilise la class libmail de Léo West :
http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=fr


<cit.>
Synopsis

include "libmail.php";
$m= new Mail; // create the mail
$m->From( "" );
$m->To( "" );
$m->Subject( "the subject of the mail" );
$m->Body( "HellonThis is a test of the Mail component" ); // set the body

$m->Cc( "");
$m->Bcc( "");
$m->Priority(4) ; // set the priority to Low
$m->Attach( "/home/leo/toto.gif", "image/gif", "inline" ) ; // attach a
file of type image/gif to be displayed in the message if possible
$m->Send(); // send the mail

echo "Mail was sent:"
echo $m->Get(); // show the mail source
</cit.>

Toutes les variables utilisé par la classe libmail sont initialisées
dans mes scripts de la façon suivante :

$var1 = "" ;
$var2 = "" ;
$var3 = "" ;
...
$varN = "" ;

extract($_POST,EXTR_OVERWRITE);


Tu ne sembles pas vérifier grand chose, et par ailleurs tu ne nous dis
pas comment tu les utilises après.

Je peux faire quoi de plus ? Vérifier si la page d'où provient la
demande est bien celle qui contient mon formulaire ?


Tu peux :
1) Ne rien mettre que des chaînes codées en dur dans To, Cc et Bcc,
voire dans From et Subject si ton utilisation s'y prête.
2) Vérifier qu'il n'y a que des caractères sans danger dans From et
Subject s'ils viennent de $_POST. Par exemple que des caractères
ASCII entre l'espace (code 32) et le tilde (code 126), mais
*surtout* qu'il n'y ait *AUCUN* r ou n.

Avatar
messian_nospam
Olivier Miakinen <om+ wrote:


Tu peux :
1) Ne rien mettre que des chaînes codées en dur dans To, Cc et Bcc,
voire dans From et Subject si ton utilisation s'y prête.
2) Vérifier qu'il n'y a que des caractères sans danger dans From et
Subject s'ils viennent de $_POST. Par exemple que des caractères
ASCII entre l'espace (code 32) et le tilde (code 126), mais
*surtout* qu'il n'y ait *AUCUN* r ou n.


Il faudrait que j'ajoute un filtre pour vérifier le contenu de tous les
champs qui peuvent servir à l'injonction... pas trop le temps en ce
moment.

Ne serait-il pas plus efficace et plus rapide de vérifier dans chacun
des scripts qui utilise la fonction mail() de php que le formulaire d'où
provient la demande est bien sur mon serveur ?

Par exemple :

$url_origine = "http://www.domaine.com/formulaire.html" ;

if ($url_origine==$_SERVER['HTTP_REFERER']) {


// ICI LE SCRIPT QUI ENVOIT LE MAIL

}

?


--
Un moyen de garde pour vos enfants ?
http://www.easynounou.com

Avatar
Olivier Miakinen

Il faudrait que j'ajoute un filtre pour vérifier le contenu de tous les
champs qui peuvent servir à l'injonction... pas trop le temps en ce
moment.


Ça ne te gêne pas aux entournures de savoir que ton site sert de relais
à spam ? Et que tu risques de te faire blacklister si tu ne fais rien ?

Note que le filtre peut être aussi simple que :
$from = preg_replace("/[rn]/", "", $from);
$subject = preg_replace("/[rn]/", "", $subject);

(du moins en espérant que ce n'est pas l'utilisateur qui peut fixer To,
Cc ou Bcc, car sinon tu lui offres une machine à spam dorée).

Ne serait-il pas plus efficace et plus rapide de vérifier dans chacun
des scripts qui utilise la fonction mail() de php que le formulaire d'où
provient la demande est bien sur mon serveur ?

[...]
if ($url_origine==$_SERVER['HTTP_REFERER']) {


Je ne vois pas en quoi cela empêche le spam, et ce pour deux raisons.
L'une des raisons est que l'attaque peut venir d'un de tes propres
formulaires si tu offres un champ de saisie relativement libre. Mais
la raison principale est que $_SERVER['HTTP_REFERER'] peut être pipoté
sans aucune difficulté par un spammeur. C'est même probablement la
première chose qu'il positionne.

==> Protection = ZÉRO

Avatar
messian_nospam
Olivier Miakinen <om+ wrote:


Il faudrait que j'ajoute un filtre pour vérifier le contenu de tous les
champs qui peuvent servir à l'injonction... pas trop le temps en ce
moment.


Ça ne te gêne pas aux entournures de savoir que ton site sert de relais
à spam ? Et que tu risques de te faire blacklister si tu ne fais rien ?


Evidemment !


Note que le filtre peut être aussi simple que :
$from = preg_replace("/[rn]/", "", $from);
$subject = preg_replace("/[rn]/", "", $subject);

(du moins en espérant que ce n'est pas l'utilisateur qui peut fixer To,
Cc ou Bcc, car sinon tu lui offres une machine à spam dorée).


Justement, il faut que je décortique la class libmail.php pour les Cc et
Bcc. Je me demande si elle est bien sécurisée.

--
Un moyen de garde pour vos enfants ?
http://www.easynounou.com


Avatar
filh
JF Messian wrote:

Olivier Miakinen <om+ wrote:


Il faudrait que j'ajoute un filtre pour vérifier le contenu de tous les
champs qui peuvent servir à l'injonction... pas trop le temps en ce
moment.


Ça ne te gêne pas aux entournures de savoir que ton site sert de relais
à spam ? Et que tu risques de te faire blacklister si tu ne fais rien ?


Evidemment !


Note que le filtre peut être aussi simple que :
$from = preg_replace("/[rn]/", "", $from);
$subject = preg_replace("/[rn]/", "", $subject);

(du moins en espérant que ce n'est pas l'utilisateur qui peut fixer To,
Cc ou Bcc, car sinon tu lui offres une machine à spam dorée).


Justement, il faut que je décortique la class libmail.php pour les Cc et
Bcc. Je me demande si elle est bien sécurisée.


En fait j'avais trouvé un truc tout con pour éviter les injections était
de fixer les destinataires dans le code, et d'encapsuler tout ce qui
arrivait de l'extérieur dans une pièce jointe mime...

Ce qui fait que ce qui est variable n'est pas du tout traité par les
MTA.

Ceci demande que les destinataires soient forcément fixes connus
d'avance.

FiLH


--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org



Avatar
messian_nospam
FiLH wrote:

En fait j'avais trouvé un truc tout con pour éviter les injections était
de fixer les destinataires dans le code, et d'encapsuler tout ce qui
arrivait de l'extérieur dans une pièce jointe mime...


Tu peux développer un peu ?


Ce qui fait que ce qui est variable n'est pas du tout traité par les
MTA.


C'est quoi les MTA ?

MERCI !

--
Un moyen de garde pour vos enfants ?
http://www.easynounou.com

Avatar
filh
JF Messian wrote:

FiLH wrote:

En fait j'avais trouvé un truc tout con pour éviter les injections était
de fixer les destinataires dans le code, et d'encapsuler tout ce qui
arrivait de l'extérieur dans une pièce jointe mime...


Tu peux développer un peu ?


On subissait des injections par l'ajout de faux entêtes mimes qui
redélimitaient les header (au niveau du to: à partir du from :)). Un
truc un peu à la con.

Donc faire une pièce jointe (même de type ascii) du texte saisi permet
d'être sûr que son contenu ne jouera pas avec les headers.

Ce qui fait que ce qui est variable n'est pas du tout traité par les
MTA.


C'est quoi les MTA ?

Mail Transport Agent...


FiLH

--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org