Page 1 sur 1

Fonction mail() et sécurité

Posté : 05 oct. 2006, 11:32
par djdiabolik
Bonjour,

j'ai reçu un mail d'information de l'hébergeur de mon site concernant les failles de sécurité des scripts php.

Je n'en utilise qu'un seul pour ma part, dans un formmail tout simple.

En l'occurence j'ai un simple formulaire dans lequel on peut saisir un message (le corps) qui envoie un mail à l'admin du site.
On ne peut pas configurer l'email d'origine, ni le sujet du mail.

Voici ma fonction :

mail('maildeladminecritenclairdanslescript', 'Suggestion Produit ', $_POST['corps']);

Le mail est lisible, le sujet aussi, et ne font pas appel à une variable stockée quelque part. Il n'y a que le corps qui récupère la zone de ma page de formulaire de saisie.

Comme je ne m'y connais pas en php, quelqu'un pourrait-il me renseigner sur les risques de sécurité potentiel de ma ligne de code, et s'il y en a (ce dont je suis sûr), comment faire pour sécuriser ma fonction...

Merci d'avance... :)

Posté : 05 oct. 2006, 11:38
par Victor BRITO
Salut et bienvenue parmi nous!

Pour lutter contre les spammeurs, ce sujet est intéressant.

En outre, si tu peux montrer le reste du code de la page de formulaire en question, ce sera mieux: peut-être que la faille est à chercher ailleurs.

Posté : 05 oct. 2006, 11:44
par djdiabolik
Bonjour,

tout d'abord merci pour la rapidité de la réponse.

voici le code du formulaire, très simple également :

Code : Tout sélectionner

<div id="centre"> <form method=POST action=formmail.php > <h3>Suggestion(s) produit</h3> <textarea cols=40 rows=6 name=corps></textarea> <h3> <input type=submit value=Envoyer> <input type=hidden name=subject value=formmail /> </form> </h3> </div>
Je vais regarder le sujet que tu as mis en lien.

Merci! :D

Posté : 05 oct. 2006, 13:34
par Victor BRITO
Salut!

Avant que d'envoyer le formulaire, il est bon de vérifier si le champ de texte est renseigné. S'il ne l'est pas, on maintient l'affichage du formulaire.
 
<?php 
// Définition du champ corps 
$corps=(isset($_POST['corps']))? $_POST['corps']: ''; 

// Si le champ est renseigné et qu'il n'est pas vide, on envoie le formulaire par courriel 
if (isset($corps) && !empty($corps)) mail('adresse', 'sujet', stripslashes($corps), 'en-têtes'); 
?> 
<div id="centre"> 
<?php 
if (!isset($_POST['corps']) || empty($corps)){ 
?> 
  <form method="post" action="formmail.php" > 
    <h3>Suggestion(s) produit</h3> 
    <textarea cols="40" rows="6" name="corps"></textarea> 
    <input type="submit" value="Envoyer"> 
  </form> 
<?php 
} 
else{ 
?> 
  <p>Le formulaire a &eacute;t&eacute; envoy&eacute;. Merci.</p> 
<?php 
} 
?> 
</div>  
Si quelqu'un peut supprimer le message de l'invité (qui n'est autre que moi), merci... :oops:

Posté : 05 oct. 2006, 13:45
par djdiabolik
Merci Victor pour ce conseil d'optimisation, je vais l'inclure dans mon code.

Mais tu n'as pas vraiment répondu à ma question concernant les failles de sécurité de la fonction mail.

Je pense notamment à ceci que j'ai trouvé en surfant sur le net concernant les failles potentielles.

Pensez-vous que mon utilisation de la fonction mail() puisse être détournée facilement par une personne mal intentionnée comme il est indiqué dans le sujet du lien ci-dessus, ou bien par le simple fait de ne pas laisser le header du mail en paramètre, celà bloque les possibilités?
J'avoue ne pas être vraiment au courant des potentiels des "hackers"...

Merci pour votre disponibilité. :)

Posté : 05 oct. 2006, 14:36
par Victor BRITO
Salut!

Il y a un risque d'injection d'en-têtes s'il y a un champ courriel qui doit être renseigné.
 
<?php 
// Définition du champ corps 
$courriel=(isset($_POST['courriel']))? $_POST['courriel']: '';
$corps=(isset($_POST['corps']))? $_POST['corps']: ''; 

/* Si le champ est renseigné et qu'il n'est pas vide et s'il n'y a pas d'injections d'en-têtes
(vérification par une expression régulière de la présence ou non 
de caractères de retour à la ligne ou de retour de chariot), 
on envoie le formulaire par courriel*/
if (isset($corps) && !empty($corps) && !eregi(array("\n", "\r"), $courriel)){
  mail('adresse', 'sujet', stripslashes($corps), 'en-têtes');
}
?> 
<div id="centre"> 
<?php 
if (!isset($_POST['corps']) || empty($corps) || eregi(array("\n", "\r"), $courriel)){ 
?> 
  <form method="post" action="formmail.php" > 
    <h3>Suggestion(s) produit</h3> 
    <input name="courriel" type="text">  
    <textarea cols="40" rows="6" name="corps"></textarea> 
    <input type="submit" value="Envoyer"> 
  </form> 
<?php 
} 
else{ 
?> 
  <p>Le formulaire a &eacute;t&eacute; envoy&eacute;. Merci.</p> 
<?php 
} 
?> 
</div>  

Posté : 05 oct. 2006, 15:56
par Ripat
J'ai le souvenir que la fonction mail() de PHP nettoye les champs des trois premiers arguments de la fonction (to, subject, msg). Je pense l'avoir vérifié par le passé et ça ne posait pas de problème.

Par contre tout champ SMTP entré par un header additionnel dans cette fonction doit être purgé des \r\n parasites et malveillants.

Voir: http://www.phpfrance.com/forums/voir_su ... ection.php

@ Victor BRITO Pourrais-tu éditer ton post précédent. Il me semble qu'il perturbe la mise en page de ce fil.

Posté : 05 oct. 2006, 16:00
par djdiabolik
Super j'en conclue donc que ma fonction mail ne risque pas grand chose dans la mesure où chez moi le destinataire, le sujet et l'entête ne sont pas alimentés par le formulaire mais sont inscrits directement dans l'appel de la fonction mail: ils sont constants en quelque sorte....
En l'occurence j'ai un simple formulaire dans lequel on peut saisir un message (le corps) qui envoie un mail à l'admin du site.
On ne peut pas configurer l'email d'origine, ni le sujet du mail.

Voici ma fonction :

mail('maildeladminecritenclairdanslescript', 'Suggestion Produit ', $_POST['corps']);
Ma question, et je la reformule alors : Est-il possible à quelqu'un de "modifier" les valeurs de destinataire, sujet, voire même de redéfinir l'appel de la fonction mail de mon formmail en y ajoutant le paramètre "header" bien que je ne l'utilise pas (cf quote ci-dessus)???

Je sais ça fait parano, mais on ne sait jamais... :roll:

Merci pour votre aide messieurs :D

Posté : 05 oct. 2006, 16:30
par Victor BRITO
Salut!

Si tu laisses quelqu'un accéder à ton fichier PHP, tu as raison de le craindre. Mais, comme PHP est interprété par le serveur, qui renvoie une page HTML au navigateur du client (sans aucun morceau compris entre <?php et ?>), ce n'est pas la peine d'être paranoïaque, même s'il ne faut pas négliger la sécurité quand on fait du PHP.

Ripat, je crois que c'est bon. :wink:

Posté : 05 oct. 2006, 17:00
par naholyr
Ma question, et je la reformule alors : Est-il possible à quelqu'un de "modifier" les valeurs de destinataire, sujet, voire même de redéfinir l'appel de la fonction mail de mon formmail en y ajoutant le paramètre "header" bien que je ne l'utilise pas (cf quote ci-dessus)???
Non, sans utilisation de eval() et de code dynamique, tu réduis à quasiment 0 les chances qu'on puisse modifier des paramètres que tu as définis "en dur". Je ne dis pas 0 car qui sait, il existe peut-être une faille dans l'interpréteur PHP, qui puisse être utilisée via une faille d'Apache, qui permette de modifier les arguments durs. Mais bon, il y a peut de chance tout de même hein :)

Posté : 06 oct. 2006, 17:18
par djdiabolik
Ok

Merci à tous pour vos réponses rapides...

A la prochaine ! :wink: