[PHP][Securite]Code de controle de formulaire pour mail()

Sur plusieurs de nos sites, on a des petits malins qui utilisent nos formulaires de contacts pour envoyer du spam, grace a des gros trous de secu sur les dis feuilles de contacts. (note: je suis pas responsable de ces codes tous nazes :P)

Je me suis mis a la recherche de code PHP tout prets pour ce genre de choses. Malheureusement, c’est generalement payant (et assez cher pour le concept), meme si j’ai reussi a trouver un exemple interessant mais qui manque de controles.

Des exemples que j’ai eu, on peut avoir plusieurs cas:

  1. Email injection
    Le formulaire demande l’email du “client” et via ce champ, on peut faire ca:

toto@bouh.fr\n bcc: spam1@aol.fr, spam2@yahoo.fr [...]
Ce cas la est assez simple a gerer avec la bonne regexp et SCForm le fait tres bien

  1. Field injection
    La, c’est plus tordu. mail() est une fonction assez basique et contient pas mal de trous implicite (by design comme dirait Glop :P)
    Imaginez ceci:

Il suffit de faire un $body de ce type:

[code]bcc: spam1@aol.fr, spam2@yahoo.fr […]

pub gratuite
.[/code]
Truc important: entre les headers et le body, y a un \n\n. Pour terminer le mail, il faut “\n.\n” et hop, c’est envoye.

Du coup, le controles des champs est important. Si pour des champs d’une ligne, un simple controle sur \n suffit a priori, ca devient plus complique pour des commentaires (ou le \n est necessaire).

Bref, ma question:
_Est ce que vous connaissez un outil PHP libre pour:
_La gestion des champs d’un formulaire (general)
_La gestion des champs d’un formulaire pour les emails.

Je me souviens que Glop avait fait un validateur HTML pour les forum, c’est un peu l’idee mais plutot pour des mails (et en PHP, pas en C#).

Merci d’avance.

LoneWolf
Crevez tous, spammeurs!

[quote=“LoneWolf, post:1, topic: 28255”]Bref, ma question:
_Est ce que vous connaissez un outil PHP libre pour:
_La gestion des champs d’un formulaire (general)
_La gestion des champs d’un formulaire pour les emails.[/quote]

  • Perso j’utilise pas mal smarty comme moteur de templates, ainsi que formsess: un add-on pour les formulaires.
  • Pour les emails, il y a dans la librairie PEAR un objet Mail qui fait de la validation pour les recipients.
    Normalement il ajoute les \n necessaires pour qu’on ne puisse pas utiliser l’astuce avec le body

Je viens de commencer ma semaine sur ce problème because mon pieces-motos.com a été détourné de la même façon par la page de contact.
Vous pouvez donc y voir que je demande un email de retour et le message lui-même. Ces $^*ù de spammeurs ont fait de l’injection de header et ont réussi à me mettre en abuse puis en blacklistage. Joie.
Depuis, j’ai colmaté. J’utilise phpmailer pour l’envoi de mail. Voici mon code :
[codebox]
function CleanInput($str)
{
$forbid = array( “from:”,“subject:”,“bcc:”,“To:”,“CC:”,“mime-version:”,“base64”,“content-type:”,“content-transfer-encoding:”,“content-disposition:”,“content-location:”,“include”,“javascript”,“embed”,“iframe”,“refresh”,“onload”,“onstart”,“onerror”,“onkey”,“onmouse”,“document.cookie”,“jscript”,“vbscript”,“pearlscript”);
$str = addslashes(strip_tags($str));
for($i=0; $i < count($forbid); $i++)
{
$str = str_ireplace($forbid[$i],"",$str);
}
return( $str );
}

// ------------------------------------------------------------------------------------------

if ( eregi("\r",$_POST[“email”]) || eregi("\n",$_POST[“email”]) )
{
exit();
}
require_once("…/…/…/functions/phpmailer/class.phpmailer.php");
$mailer = new phpmailer();
$mailer->Mailer = “mail”;
$mailer->IsHTML(false);
$mailer->AddAddress($site[“email_contact”]);
$mailer->AddReplyTo(“no-reply@”.$site[“domaine”]);
$mailer->From = $_POST[“email”];
$mailer->FromName = $_POST[“email”];
$mailer->Subject = "Message venant de ".$site[“domaine”];
$mailer->Body = “\n\n”.CleanInput($_POST[“msg”]);

[/codebox]

Ma fonction CleanInput fait beaucoup plus de choses mais je n’ai pas tout mis.
Il y a donc sortie du script dès que le champ email contient 0x0A ou 0x0D et simplement suppression de tout ce qui ressemble de près ou de loin à une saloperie.
Pour le moment ça tient la route.

Antoine

Edit de Fask : faites gaffe à pas exploser les forums, les enfants… le tag “codebox” c’est le bien, le tag “code” c’est le mal.