Page 1 sur 1

Sécuriser un formulaire avant mail()

Posté : 02 oct. 2006, 10:09
par cktoon
Bonjour,
J'ai un problème de spam sur un formulaire, j'aimerais avoir de l'aide pour sécuriser tout ça, pouvez-vous m'aider ?

Je simplifie les choses, disons que j'ai 3 champs : email de l'expéditeur / message / sujet du message

Le formulaire utilise la méthode post, et est traité dans la même page :

Code : Tout sélectionner

<form name="form1" method="post" action=""> Sujet : <input name="sujet" type="text" /> Email : <input name="email" type="text" /> Message : <textarea name="message" cols="50" rows="5"></textarea> <input name="valider" value="Valider et envoyer" type="submit" /> </form>
Je récupère les valeurs dans 3 variables :

Code : Tout sélectionner

$sujet=stripslashes($_POST['message']); $email=stripslashes($_POST['email']); $message=stripslashes($_POST['message']);
Je nettoie les chaines de caractères :

Code : Tout sélectionner

$sujet= ereg_replace("(cc:|bcc:|from:)"," -nospam- ",$sujet); $email= ereg_replace("(cc:|bcc:|from:)"," -nospam- ",$email); $message = ereg_replace("(cc:|bcc:|from:)"," -nospam- ",$message);
Et j'envoie les données :

Code : Tout sélectionner

$entete='MIME_Version: 1.0\r\n'; $entete.='Content-type:text/plain; charset="iso-8859-15"\r\n'; $entete.='Content-Transfer-Encoding:quoted-printable\r\n'; $entete.='From:'.$email.'\r\n'; $destinataire = ledestinataire_AROBASE_domaine.com $envoi = mail($destinataire, $sujet, $message, $entete);
Pouvez-vous me dire quelles sont encore les failles ?
Y-a-t-il moyen de falsifier les entêtes encore ? ou d'injecter du code qui utilise la fonction mail pour envoyer des spams via le formulaire ?

Merci de votre aide

Posté : 02 oct. 2006, 11:52
par Erazer
Bonjour,

Si tu l'envoies en format text/plain, je dirai que

vérifier que le format de l'email soit correcte.


pour les autres champs, je doute qu'on puisse faire grand chose en text.

si tu l'envoies en HTML, faire attention aux xss utilise htmlentities() par exemple

il y a certainement des sécurités côté clients pour les xss, mais il vaut mieux prévenir.


donc,

1. Vérifier le format de l'email

Si tu envoies un email HTML
2. htmlentities() voir addslashes().


Voilà

Posté : 03 oct. 2006, 15:26
par cktoon
Salut,
eh bien à vrai dire, j'ai un formulaire en text sur un site qui a été utilisé pour un spam à grande échelle qui m'a valu un appel de mon hébergeur....

D'après ce que j'ai reçu, j'ai mis les nettoyages des éventuels bcc: dans les champs de texte. Mais ce que j'ai remarqué, c'est que les entêtes avaient été modifiées et que mon spammeur avait été capable de créer un message multipart (text et html) pour ses petites affaires pas belles... avec nouvelle entete donc et nouveau sujet, alors qu'à priori, ces variables ne sont pas définies par un champ de formulaire, mais à l'intérieur de mon script...

Donc, je me demande tout de même comment il a fait...
et surtout comment faire en sorte de m'assurer que je ne laisse pas une énorme faille facile à exploiter pour d'autres petits malins...
d'où ma demande.

Je vais effectivement tester la valeur de l'email avec une bonne REGEX,
et regarder ce que sont les xss dont tu parles... :?

Posté : 03 oct. 2006, 18:11
par Erazer
si tu veux, Zend framework propose une classe toute faite pour envoyer un email.

<?php
            require_once 'Zend/Mail.php';
            $mail = new Zend_Mail();
            $mail->setBodyText('Ceci est le message.');
            $mail->setFrom('[email protected]', 'un expéditeur');
            $mail->addTo('[email protected]', 'un destinataire');
            $mail->setSubject('sujet de test');
            $mail->send();
            ?>

un petit exemple, tu as toutes les possibilités dans le mode d'emploi ci-dessous:
http://framework.zend.com/manual/fr/zend.mail.html

tu peux aussi y mettre une "image" pour limité encore. quand je dis image, je parle de celle que tu dois le code qui apparaît dedans.