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

Anti-spam: securiser un formulaire d'en voi d'email

5 réponses
Avatar
Steph
Bonjour,

J'ai un site sur Online qui a été victime de spammeurs qui ont injecté
du code dans mes champs, je les ai bloqué depuis, grâce à diverses aides
trouvées sur le net, permettant de filtrer sur des "\r" ou "\n", ou bien
sur les mots clés ainsi:
----------------------------------------
function isValidStrings($string)
{
$badStrings = array("Content-Type:", "MIME-Version:",
"Content-Transfer-Encoding:", "bcc:", "cc:");
foreach($badStrings as $v){
if(strpos($string, $v) !== false)
{
return false;
}
}
return true;
}

while (list($key, $val) = each($HTTP_POST_VARS))
{

if($key=="Commentaire")
{
$val=stripslashes($val);
//$val=htmlentities(addslashes(nl2br($val)));
}


if (eregi("\r",$val))
{
print($key.": ".$val.": illegal characters [1].");
exit();
}

if (eregi("\n",$val))
{
print($key.": ".$val.": illegal characters [4].");
exit();
}


$val2 = preg_replace("/(?=\s)[^ \t].*/s","", $val);

if($val!=$val2)
{
print($key.": ".$val.": illegal characters [2].");
exit();
}

if (!isValidStrings($val)) {
print($val.": illegal characters [3].");
exit();
}
-------------------------------------------------

Çà marche impec pour toutes balises <input text...>
Par contre je bloque sur les <textarea...> qui contiennent des RETOURs.
Avez-vous sous la main un site qui renseigne sur la façon d'éviter des
injections dans le <textarea...>

P.S.: Et le bonjour à John Gallet (çà fait un bail...), qui, s'il ne me
lit pas, est j'espère les pieds dans l'eau, et tant mieux pour lui :)

--
Steph
Enlever l'.adressebidon.invalid pour m'écrire en privé

5 réponses

Avatar
Olivier Miakinen

J'ai un site sur Online qui a été victime de spammeurs qui ont injecté
du code dans mes champs, je les ai bloqué depuis, grâce à diverses aides
trouvées sur le net, permettant de filtrer sur des "r" ou "n", ou bien
sur les mots clés ainsi:
[...]
$badStrings = array("Content-Type:", "MIME-Version:",
"Content-Transfer-Encoding:", "bcc:", "cc:");
[...]
-------------------------------------------------


Bon, je suppose que ce filtrage se fait sur les champs qui vont dans les
entêtes d'un courriel.

Çà marche impec pour toutes balises <input text...>
Par contre je bloque sur les <textarea...> qui contiennent des RETOURs.


???

Je ne comprends pas. Tu filtres donc en fonction du code HTML qui te
permet d'obtenir les valeurs plutôt qu'en fonction de la destination
des champs ?

Tout d'abord, sache que même si le code HTML que tu as écrit ne permet
pas d'inclure des CRLF dans un champ donné, cela n'empêchera nullement
un spammeur de t'envoyer une requête POST avec autant de CRLF qu'il
voudra dans n'importe quel champ. Donc tu dois filtrer les CRLF dans
ton code PHP sur les champs qui ne doivent pas en avoir (donc les
entêtes de courriel, sauf bien sûr si tu utilises des FWS).

Inversement, un texte qui va dans le corps du message peut très bien
inclure autant de CRLF que l'on veut. Il faut peut-être même en rajouter
pour éviter d'avoir des lignes de plus de 998 caractères.

Avez-vous sous la main un site qui renseigne sur la façon d'éviter des
injections dans le <textarea...>


Des « injections dans le <textarea> » ça ne veut rien dire. Les
injections, elles dépendent de là où tu mets les $_REQUEST['qqch'],
sachant que les spammeurs n'ont pas besoin de <textarea> pour ça.

Cordialement,
--
Olivier Miakinen

Avatar
Steph
Le 23/07/2006 01:28, Olivier Miakinen disait:
J'ai un site sur Online qui a été victime de spammeurs qui ont injecté
du code dans mes champs, je les ai bloqué depuis, grâce à diverses aides
trouvées sur le net, permettant de filtrer sur des "r" ou "n", ou bien
sur les mots clés ainsi:
[...]
$badStrings = array("Content-Type:", "MIME-Version:",
"Content-Transfer-Encoding:", "bcc:", "cc:");
[...]
-------------------------------------------------


Bon, je suppose que ce filtrage se fait sur les champs qui vont dans les
entêtes d'un courriel.

Çà marche impec pour toutes balises <input text...>
Par contre je bloque sur les <textarea...> qui contiennent des RETOURs.


???

Je ne comprends pas. Tu filtres donc en fonction du code HTML qui te
permet d'obtenir les valeurs plutôt qu'en fonction de la destination
des champs ?

Tout d'abord, sache que même si le code HTML que tu as écrit ne permet
pas d'inclure des CRLF dans un champ donné, cela n'empêchera nullement
un spammeur de t'envoyer une requête POST avec autant de CRLF qu'il
voudra dans n'importe quel champ. Donc tu dois filtrer les CRLF dans
ton code PHP sur les champs qui ne doivent pas en avoir (donc les
entêtes de courriel, sauf bien sûr si tu utilises des FWS).


En fait c'est un formulaire qui m'envoie par email les saisies utilisateurs:
Nom:
Prénom:
Adresse:
etc...
Ceux là sont des champs <input>. C'est un de ceux là qui avait subi une
injection de plusieurs adresses emails en bcc, comme indiqué sur cette page:
http://www.securephpwiki.com/index.php/Email_Injection qui se sont
glissées dans ma fonction mail().

Inversement, un texte qui va dans le corps du message peut très bien
inclure autant de CRLF que l'on veut. Il faut peut-être même en rajouter
pour éviter d'avoir des lignes de plus de 998 caractères.


OK je wrap

Avez-vous sous la main un site qui renseigne sur la façon d'éviter des
injections dans le <textarea...>


Des « injections dans le <textarea> » ça ne veut rien dire. Les
injections, elles dépendent de là où tu mets les $_REQUEST['qqch'],
sachant que les spammeurs n'ont pas besoin de <textarea> pour ça.


Oui mais çà fait tellement longtemps que je n'ai pas touché du php que
je suis long à la détente :)
En fait, avant de m'envoyer l'email, je passe toutes les valeurs $_POST
à la moulinette: Formulaire --> OK --> (moulinette)envoi_email.php
Sur des champs <input text>, plus aucune injection ne passe, par contre
mon filtre crie (illegal characters) car il trouve des RETOUR dans le
textarea:
J'applique par exemple ce filtre sur mon textarea:
<?php
$t = $_POST["texte"];
$t = urldecode($t);
if (eregi("r",$t) || eregi("n",$t)){
die("illegal characters !");
}
?>
et bien sûr il crie !

Je laisse passer sans risque ou pas ? N'appliquer que le filtre sur
mots-clés (MIME..) suffit ?
Ou est-il possible de filtrer sur %0A ?

Bon apéro !

--
Steph
Enlever l'.adressebidon.invalid pour m'écrire en privé


Avatar
Olivier Miakinen

[ très longue citation ]

En fait c'est un formulaire qui m'envoie par email les saisies utilisateurs:
[...]
injection de plusieurs adresses emails en bcc, comme indiqué sur cette page:
http://www.securephpwiki.com/index.php/Email_Injection


Merci pour le lien, je vais aller le lire. De ton côté, n'hésite pas à
lire <http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html&gt; où
il est recommandé de ne citer que le strict minimum nécessaire à la
compréhension. La charte de ce groupe interdit les citations trop
longues, et tu aurais bien pu ne pas être publié.

[...]

Je laisse passer sans risque ou pas ? N'appliquer que le filtre sur
mots-clés (MIME..) suffit ?
Ou est-il possible de filtrer sur %0A ?


En très gros, la structure d'un courriel est la suivante (FWS mis à part) :

nom-entete: entete CRLF
nom-entete: entete CRLF
nom-entete: entete CRLF
nom-entete: entete CRLF
nom-entete: entete CRLF
nom-entete: entete CRLF
nom-entete: entete CRLF
nom-entete: entete CRLF
CRLF
ligne de message CRLF
ligne de message CRLF
ligne de message CRLF
ligne de message CRLF
ligne de message CRLF
ligne de message CRLF
ligne de message CRLF
.CRLF

Seuls les entêtes sont dangereux du point de vue du spam. Après le
double CRLF qui sépare les entêtes du corps du message tu peux avoir
autant de CRLF que tu veux sans aucun risque.

[ suivi proposé vers fr.comp.mail puisqu'il ne s'agit plus du tout de
PHP dans ma réponse ]

Avatar
Steph
Le 23/07/2006 13:01, Olivier Miakinen disait:
La charte de ce groupe interdit les citations trop
longues, et tu aurais bien pu ne pas être publié.


oups !
[snip]

Seuls les entêtes sont dangereux du point de vue du spam. Après le
double CRLF qui sépare les entêtes du corps du message tu peux avoir
autant de CRLF que tu veux sans aucun risque.


Et bien voilà, tu m'as éclairé merci ! Mes headers étant le from, to,
subject et le reste allant dans le body, je n'ai donc pas besoin de
filtrer mon textarea sur des rn

[ suivi proposé vers fr.comp.mail puisqu'il ne s'agit plus du tout de
PHP dans ma réponse ]


Ceci étant basé sur la sécurisation d'un form_mail en php, je me permets
de conclure ici :)

Bonne sieste !

--
Steph
Enlever l'.adressebidon.invalid pour m'écrire en privé

Avatar
Steph
Le 23/07/2006 13:01, Olivier Miakinen disait:

Merci Olivier
Adresse de mon form:
http://lavillerose.free.fr/essai.htm

Tu ne publies pas, merci.
Seulement pour tester des injections, si bien sûr, ton temps le permet.

--
Steph
Enlever l'.adressebidon.invalid pour m'écrire en privé