Injection headers formulaire php

Signaler
Messages postés
7
Date d'inscription
jeudi 13 septembre 2007
Statut
Membre
Dernière intervention
21 septembre 2007
-
Messages postés
373
Date d'inscription
samedi 9 juillet 2005
Statut
Membre
Dernière intervention
11 août 2008
-
(re)Bonjour,
cette discussion, fait suite à mon précédent post : "Valider les données d'un formulaire".

Ma question est simple, mais la réponse semble l'être moins ;) :
Comment se protéger efficacement contre l'injection d'entête dans une formulaire php ?

Base de réflexion : http://www.phpsecure.info/v2/article/MailHeadersInject.php

Dans mon cas, les données récupérées de l'utilisateur ne sont pas destinées à être insérées dans une base de données, mais simplement à être transmises par email.

magic_quotes_gpc est à "on" sur mon hébergement.

En pratique, les entêtes TO, FROM et SUBJECT sont déclarées "en dur" dans mon script, comme ceci :

$entetedate = date("D, j M Y H:i:s +0200");
$to = "mail@me.com";
$subject = "Formulaire Contact";
$entete = "From: Contact <contact@me.com>\n";
$entete .= "MIME-Version: 1.0\n";
$entete .= "Reply-To: contact@me.com\n";
$entete .= "X-Sender: contact@me.com\n";
$entete .= "X-auth-smtp-user: contact@me.com\n";
$entete .= "X-abuse-contact: postmaster@me.com\n";
$entete .= "Date: $entetedate\n";
$entete .= "Content-Type: text/plain; charset="iso-8859-15"\n";
$entete .= "Content-Transfer-Encoding: 8bit";
$message = "contenu du message";
mail($to, $subject, $message, $entete);

Toutes les variables renseignées par l'utilisateur sont incorporées uniquement dans le corps du message après un traitement stripslahes et trim, ici :
$message = "contenu du message
//insertion des variables récupérées de l'utilisateur
";

2 réponses

Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
Hello,

ne met aucune variable qui puisse être définie par un utuilisateur dans les entêtes, tout simplement.
Messages postés
373
Date d'inscription
samedi 9 juillet 2005
Statut
Membre
Dernière intervention
11 août 2008

Salut,
Il me semble qu'il faut faire un retour à la ligne à la fin de chaque header...
Il suffirait donc de faire comme ceci pour sécuriser le script :
<?php
// On vérifie si la variable contient des sauts de lignes.
if (strpos($_GET['var'], "\n") !== FALSE) echo 'Variable douteuse';
else echo 'Variable OK';
?>

For every choice, a consequence (Fable)