Tous les billets étiquettés / sécurité

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.