Protéger la fonction mail() des injections d’en-têtes

Vous avez développé un formulaire d’envoi par courriel utilisant la fonction mail()? Si oui, avez-vous pensé à vous protéger des injections d’en-têtes, lesquelles peuvent faire de votre beau petit script de 10 lignes un relai de spam considérable? Non? Qu’attendez-vous?

Comment les spammers s’y prennent?

Très simple! Il ne font qu’entrer un truc du genre dans un champ de votre formulaire :

1
email@domaine.com n CC: spam1@domaine.com, spam2@domaine.com...

Les en-têtes e-mail étant très sensibles, elles considèrent le saut de ligne (r) ou les nouvelles lignes (n) explicites comme le début d’une nouvelle directive (ici, l’insertion d’une liste d’adresses en copie-conforme). Voyez une multitude d’exploit ici.

Comment s’en protéger?

Encore une fois, rien de plus facile. Dans votre validation, vous n’avez qu’à y aller d’une petite expression régulière sur les champs soumis :

1
2
if ( eregi("(r|n)", $_GET['nom']) || eregi("(r|n)", $_GET['email']) )
	exit("Va-t'en, spammer!");

N’oubliez pas de traiter chacun des champs qui sont utilisés dans la construction des en-têtes (nom, courriel, format, charset, etc.) de votre message.

Émile Girard
Je suis le Président d'Instamobile.ca, un Développeur Web passionné depuis 1998 et un Socialiseur en Réseau notoire. Un hyper-actif numérique oeuvrant dans les coulisses de sites web et applications que vous adorez. Plus »

3 commentaires pour "Protéger la fonction mail() des injections d’en-têtes"

  1. molaram says:

    Sur mon blogue : Protéger la fonction mail() des injections d’en-têtes http://bit.ly/2A9MIp

    This comment was originally posted on Twitter

  2. Pour rajouter de la sécurité pour l’envoie d’un formulaire tu peux aussi vérifier la provenance de l’internaute et le bloque si c’est appeler a partir d’un autre site que le tien pour éviter le SPAM

  3. Mon commentaire précédant n’a pas marcher deuxième essai :

    A ajouter avant l’envoie du formulaire :

    if(!eregi(“estrade.ca”, $_SERVER['HTTP_REFERER'])) die (“Va-t’en, spammer!”);

    je pense que l’espace commentaire enlève les balise d’ouverture et fermuture PHP

Vous avez quelque chose à ajouter? Allez-y!