Fonction mail()+sécurisé l'envoi

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Fonction mail()+sécurisé l'envoi

par Xenon_54 » 05 juin 2007, 02:20

$mailheaders .= "Reply-To: $mail\n\n"; 
D'où vient $mail? Je défonce ton formulaire en injectant des entêtes mails sans problème.

Simplement à indiquer ceci dans le contenu de ta variable:

Code : Tout sélectionner

[email protected]\n\r Bcc: [email protected],[email protected] Subject: Spam content My content .
J'ajoute donc sans ton consentement plein d'entête et je bypass ton propre contenu original en mettant un point seul sur une ligne.

Tu feras parti de la liste des dizaines de clients que je dois dépanner à chaque jour.
Vérifie qu'il n'y ait pas de retour de ligne dans cette variable. Fais de même pour les autres variables qui ne doivent jamais en contenir.

par kweb » 04 juin 2007, 17:39

Ok merci pour votre aide.
juste pour confirmation, c'est bien comme cela ?

function secu_var_mail($var,$key="") {
    // website contact echappe à eregi(http://)   
    if (eregi("Content-Transfer-Encoding",$var) ||
        eregi("Content-Type",$var) ||
        eregi("MIME-Version",$var) ||
        eregi("mailto:",$var) ||
        eregi("<iframe",$var) ||
        eregi("<script",$var)
        )
    {
        die("Opération non permise");
        exit();    
    }
    else if(eregi("http://",$var) && ($key!="website_contact")) {
        die("Opération non Autorisée");
        exit();    
    }   
    $var2= stripslashes(htmlspecialchars($var));
    return $var2;
}

foreach ($_POST as $element_form => $valeur_form)
    {
       $_POST[$element_form]=secu_var_mail($valeur_form);
    }

/*/t => tabulation   /n => br   /R => Retour chariot*/
$msg = "Nom:\t$_POST['nom']\n";
$msg .= "Prénom:\t$_POST['prenom']\r";
$msg .= "Société:\t$_POST['societe']\n";
$msg .= "Adresse:\t$_POST['adresse']\n";
$msg .= "Code postal:\t$_POST['cp']\n";
$msg .= "Ville:\t$_POST['ville']\n";
$msg .= "Pays:\t$_POST['pays']\n";
$msg .= "Email:\t$_POST['email']\n";
$msg .= "Téléphone:\t$_POST['telephone']\n";
$msg .= "Faxe:\t$_POST['fax']\r";

$recipient = "[email protected],";
$recipient .= "[email protected],";
$subject = "xxxxxx - Demande de xxxxxxx"; 

$mailheaders = "From: xxxxxxxxx <> \n";
$mailheaders .= "Reply-To: $mail\n\n";

mail($recipient, $subject, $msg, $mailheaders);

par jpaul » 04 juin 2007, 17:32

Dans ce cas, comme te l'as dit Ryle, si ton formulaire est envoyé par la méthode post, pour faire ce que le technicien te demande, il suffit de placer la boucle sur le tableau $_POST (qu'il t'a fournie) dans la page envoi.php (juste après la fonction que tu as déjà ajoutée).

Et pour encore plus de sécurité, tu suis les conseils de Ryle en utilisant pas les noms directement mais le tableau.

par kweb » 04 juin 2007, 17:00

Voici ce qu'il c'est passer exactement.
Une personne de la société ou je bosse ma appeler pour me dire que jeudi elle avait envoyé un mail par le biais de l'interface de Webmail et que celui-ci n'as jamais été reçu par le destinataire. de plus elle n'as jamais reçu de message de retour (ce problème lui est arrivé déjà plusieurs fois...).

J'ai donc contacter la société qui gére le serveur que nous avons.
ils ont fais des recherches par rapport au mail que cette personne avait écrite, il l'on retrouvé. il était en attente dans une liste de mail (sur le serveur) .

c'est le technicien qui ma envoyé cette fonction en me disant que cela règlerai le problème a 80%.
Je suppose qu'il a du jeter un coup d'oeil précis sur le probléme et en a conclu qu'il fallait que je mette cette fonction en place sur tout les formulaires que j'avais...

je ne peux pas plus t'en dire....

Re: Fonction mail()+sécurisé l'envoi

par jpaul » 04 juin 2007, 16:49

et que mon serveur à une liste impressionnante de mail en attente de départ, ce qui ralenti l'envoie des mails "réelle"
Et les mails en attente sur ton serveur :
sont envoyés vers quelle adresse (la tienne ou des adresses diverses et variées) ?
que contiennent-ils (le contenu du formulaire ou autre chose) ?

par kweb » 04 juin 2007, 16:43

Je ne pense pas !
Le problème ne serait-t-il pas plutôt que des petits plaisantins s'amusent à valider le formulaire ce qui provoque l'envoi de mails inutiles en grand nombre (ça peut être effectivement ressenti comme du spam).
étant donnée que c'est moi qui reçoit les emails, et je n'ai jamais reçue un très grand nombre d'email.
met je peux me tromper.....
merci
...

par jpaul » 04 juin 2007, 16:20

Bonjour

Je ne comprends pas trop quand tu parles de spam :
Ton script semble avoir des destinataires fixes
Le problème ne serait-t-il pas plutôt que des petits plaisantins s'amusent à valider le formulaire ce qui provoque l'envoi de mails inutiles en grand nombre (ça peut être effectivement ressenti comme du spam).

Si c'est le cas, ce n'est pas en vérifiant le contenu des variables que tu pourras l'éviter. Je pense qu'il faudrait plutôt rechercher du côté de solutions empêchant de soumettre un formulaire plusieurs fois sans avoir attendu un certain temps ou peut être, demander de recopier le texte contenu dans une image : je ne me rappelle plus du nom, mais ci c'est effectivement ce que tu recherches dis le, je chercherai (ou quelqu'un d'autre te le dira ;) )

par Ryle » 04 juin 2007, 15:57

En fait, le but de la fonction que l'on t'a passé est de protéger chacune des variables qui sont transmises dans le mail et qui ont été renseignées par l'utilisateur afin de l'empêcher d'y glisser un code malicieux.

Ainsi, il faudrait donc appeller cette fonction sur chacune de tes variables $nom, $prenom, etc. avant de les utiliser.

Puisque ces variables proviennent vraissemblablement d'un formulaire envoyé en post, tu peux les modifier directement à l'intérieur de la variable super globale $_POST qui les contient (tu devrais d'ailleurs, pour des raisons de sécurité et de compatibilité, utiliser $_POST['nom'] plutot que juste $nom, cf. les infos sur register_global). Tu peux donc utiliser ta boucle pour le faire automatiquement sur chaque variable qu'elle contient, avant de les utiliser :)

Fonction mail()+sécurisé l'envoi

par kweb » 04 juin 2007, 15:40

Slt tous le monde,
j'ai créer un formulaire (formulaire.htm) qui appel une page (envoi.php)qui contient une fonction mail(), pour pouvoir transférer le contenu via email.
$msg = "Nom:\t$nom\n";
$msg .= "Prénom:\t$prenom\r";
$msg .= "Société:\t$societe\n";
$msg .= "Adresse:\t$adresse\n";
$msg .= "Code postal:\t$cp\n";
$msg .= "Ville:\t$ville\n";
$msg .= "Pays:\t$pays\n";
$msg .= "Email:\t$email\n";
$msg .= "Téléphone:\t$telephone\n";
$msg .= "Fax:\t$fax\r";

$recipient = "[email protected],";
$recipient .= "[email protected],";
$subject = "Mon site - Demande de xxxxxxxxx"; 

$mailheaders = "From: xxxxxxxx <> \n";
$mailheaders .= "Reply-To: $mail\n\n";

mail($recipient, $subject, $msg, $mailheaders);
je viens de me rendre compte que des personnes mal intentionné, utilise ce formulaire pour faire du "spam". et que mon serveur à une liste impressionnante de mail en attente de départ, ce qui ralenti l'envoie des mails "réelle"

j'ai récupérer une function qui permet de faire des vérifications pour empécher à 80% l'envoie de "spam". (un collègue de boulot) mais je ne sais pas comment l'utiliser, plutôt comme insérer le code dans ma page

Voici la function
function secu_var_mail($var,$key="") {
    // website contact echappe à eregi(http://)   
    if (eregi("Content-Transfer-Encoding",$var) ||
        eregi("Content-Type",$var) ||
        eregi("MIME-Version",$var) ||
        eregi("mailto:",$var) ||
        eregi("<iframe",$var) ||
        eregi("<script",$var)
        )
    {
        die("Opération non permise");
        exit();    
    }
    else if(eregi("http://",$var) && ($key!="website_contact")) {
        die("Opération non Autorisée");
        exit();    
    }   
    $var2= stripslashes(htmlspecialchars($var));
    return $var2;
}
Il me précise dans son mail de faire une petite boucle sur le tableau $_POST
foreach ($_POST as $element_form => $valeur_form)
    {
       $_POST[$element_form]=secu_var_mail($valeur_form);
    }
Moi j'ai placer la function dans ma page envoi.php
function secu_var_mail($var,$key="") {
    // website contact echappe à eregi(http://)   
    if (eregi("Content-Transfer-Encoding",$var) ||
        eregi("Content-Type",$var) ||
        eregi("MIME-Version",$var) ||
        eregi("mailto:",$var) ||
        eregi("<iframe",$var) ||
        eregi("<script",$var)
        )
    {
        die("Opération non permise");
        exit();    
    }
    else if(eregi("http://",$var) && ($key!="website_contact")) {
        die("Opération non Autorisée");
        exit();    
    }   
    $var2= stripslashes(htmlspecialchars($var));
    return $var2;
}

$msg = "Nom:\t$nom\n";
$msg .= "Prénom:\t$prenom\r";
$msg .= "Société:\t$societe\n";
$msg .= "Adresse:\t$adresse\n";
$msg .= "Code postal:\t$cp\n";
$msg .= "Ville:\t$ville\n";
$msg .= "Pays:\t$pays\n";
$msg .= "Email:\t$email\n";
$msg .= "Téléphone:\t$telephone\n";
$msg .= "Fax:\t$fax\r";

$recipient = "[email protected],";
$recipient .= "[email protected],";
$subject = "HENKEL Grand Chelem - Demande de partenariat"; 

$mailheaders = "From: HENKEL Grand Chelem <> \n";
$mailheaders .= "Reply-To: $mail\n\n";

mail($recipient, $subject, $msg, $mailheaders);
par contre je ne sais pas ou placer ma boucle..... pourriez vous m'aider, merci