IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Mail] Spam et envoi e-mail avec PHP [Tutoriel]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 142
    Points : 83
    Points
    83
    Par défaut [Mail] Spam et envoi e-mail avec PHP
    Bonjour,

    j'utilise ce script-ci pour m'envoyer des emails depuis un formulaire depuis notre site Internet, et mon provider a coupé l'utilisation car leur serveur est innondé de spam emails, car qqn utilise mon script pour envoyer des mails non désirés, on me demande de réécrire mon script, mais je ne vois pas trop ce que je pourrais faire pour que les spams cessent.

    sur ma page avec le formulaire, quand on clique sur 'envoi', un script checke que tous les champs sont bien remplis, une fois ceci fait, on est redigiré vers une page appelée 'thanks-contact.php' et voici le code sur cette page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?php
    $prenom = $_POST['prenom']; 
    $nom = $_POST['nom']; 
    $email = $_POST['email']; 
    $adresse = $_POST['adresse']; 
    $codepostal = $_POST['codepostal']; 
    $ville = $_POST['ville']; 
    $pays = $_POST['pays']; 
    $gsm = $_POST['gsm']; 
    $sujet = $_POST['sujet']; 
    $commentaire = $_POST['commentaire']; 
     
     
    $messageToSend .= "\n";
    $messageToSend .= "Nom : ".$nom."\n";
    $messageToSend .= "Prénom : ".$prenom."\n";
    $messageToSend .= "Email : ".$email."\n";
    $messageToSend .= "Adresse : ".$adresse."\n";
    $messageToSend .= "Code postal : ".$codepostal."\n";
    $messageToSend .= "Ville : ".$ville."\n";
    $messageToSend .= "Pays : ".$pays."\n";
    $messageToSend .= "Téléphone : ".$gsm."\n";
    $messageToSend .= "Sujet : ".$sujet."\n\n";
    $messageToSend .= "Commentaire : ".$commentaire."\n";
     
    // envoyer message
    $to = "ma083028@skynet.be";
    $subject = "Formulaire de contact";
    $from = "From: $email\n";
     
    mail($to, $subject, $messageToSend, $from);
     
    ?>

    quelqu'un pourrait il m'aider ?

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    <?php
    $prenom = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['prenom']); 
    $nom = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['nom']); 
    $email = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['email']); 
    $adresse = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['adresse']); 
    $codepostal = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['codepostal']); 
    $ville = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['ville']); 
    $pays = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['pays']); 
    $gsm = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['gsm']); 
    $sujet = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['sujet']); 
    $commentaire = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['commentaire']); 
     
     
    $messageToSend .= "\n";
    $messageToSend .= "Nom : ".addslashes($nom)."\n";
    $messageToSend .= "Prénom : ".addslashes($prenom)."\n";
    $messageToSend .= "Email : ".addslashes($email)."\n";
    $messageToSend .= "Adresse : ".addslashes($adresse)."\n";
    $messageToSend .= "Code postal : ".addslashes($codepostal)."\n";
    $messageToSend .= "Ville : ".addslashes($ville)."\n";
    $messageToSend .= "Pays : ".addslashes($pays)."\n";
    $messageToSend .= "Téléphone : ".addslashes($gsm)."\n";
    $messageToSend .= "Sujet : ".addslashes($sujet)."\n\n";
    $messageToSend .= "Commentaire : ".addslashes($commentaire)."\n";
     
    // envoyer message
    $to = "ma083028@skynet.be";
    $subject = "Formulaire de contact";
    $from = "From: ".addslashes($email)."\r\n";
     
    mail($to, $subject, $messageToSend, $from);
     
    ?>
    Avec ça t'es tranquille!

    Il est possible d'exploité grâce à des injections de codes la fonction mail pour faire du spam (souvent du mail bombe)

    ici, en rajouté des \ au caractères permettant l'injection, normalement ça peut stoppé,
    mais aussi en supprimant les caractères qui ne devrait pas ce trouvé là on ne fais pas de mal...

    ps: pour les header (ici from) il faut un retour charriot + un saut de ligne.

  3. #3
    Membre régulier Avatar de BGDC
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 102
    Points : 121
    Points
    121
    Par défaut
    Salut,

    Moi je vire purement et simplement des messages contenant www. Je n'ai plus de pb.

    Bon courage.
    Bon allez, cette fois c'est sur, ça marche........bon aller je réessaye......

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    Tien, je pense que ça peut t'aider:
    http://www.securephpwiki.com/index.php/Email_Injection

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 142
    Points : 83
    Points
    83
    Par défaut Re
    ok merci pour votre aide !
    j'ai déjà changé le script sur un formulaire, on verra le résultat d'ici 30 minutes.

    pour le lien, je vais un peu lire tout cela !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    tien nous informé

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 142
    Points : 83
    Points
    83
    Par défaut Re
    voilà la fonction mail() a été réactivée
    apparemment moins de spam, mais je recois tout de même des formulaires vides alors que pourtant j'ai une fonction qui checke si tous les champs ont été remplis.

    on va monitorer tous les mails entrants pendant 1 heure, on verra le résultat.

    je vous tiens au courant.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    désolé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    <?php
    $prenom = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['prenom']); 
    $nom = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['nom']); 
    $email = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['email']); 
    $adresse = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['adresse']); 
    $codepostal = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['codepostal']); 
    $ville = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['ville']); 
    $pays = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['pays']); 
    $gsm = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['gsm']); 
    $sujet = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['sujet']); 
    $commentaire = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['commentaire']); 
     
     
    $messageToSend .= "\n";
    $messageToSend .= "Nom : ".addslashes($nom)."\n";
    $messageToSend .= "Prénom : ".addslashes($prenom)."\n";
    $messageToSend .= "Email : ".addslashes($email)."\n";
    $messageToSend .= "Adresse : ".addslashes($adresse)."\n";
    $messageToSend .= "Code postal : ".addslashes($codepostal)."\n";
    $messageToSend .= "Ville : ".addslashes($ville)."\n";
    $messageToSend .= "Pays : ".addslashes($pays)."\n";
    $messageToSend .= "Téléphone : ".addslashes($gsm)."\n";
    $messageToSend .= "Sujet : ".addslashes($sujet)."\n\n";
    $messageToSend .= "Commentaire : ".addslashes($commentaire)."\n";
     
    // envoyer message
    $to = "ma083028@skynet.be";
    $subject = "Formulaire de contact";
    $from = "From: ".addslashes($email)."\r\n";
     
    mail($to, $subject, $messageToSend, $from);
     
    ?>
    Voilà, je mettez planté avec les "`\\\x00|\\\x0a|\\\x0d|\\\x1a`" (j'avais copier coller a partir d'un array de str_replace)
    Normalement maintenant c'est efficaces
    et encore désolé

  9. #9
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 271
    Points
    271
    Par défaut
    pense a rajouter bon controlle sur le mail, genre pour voir si le mail est valide et ne contient pas de saleté comme des /nbcc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function isemail($email) {
    $regexp="/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i";
      	if ( !preg_match($regexp, $email) ) return false;
    	return true;
    }
    if(!isemail($email)){exit('votre mail est foiré');}
    Si ton serveur est sous linux, tu peux meme controller le domaine pour voir si il existe bien

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 142
    Points : 83
    Points
    83
    Par défaut Re
    ok pas de souci.

    c'est changé, donc je vais voir là nuit si le serveur est rempli de 10.000 spams ou non !

    je te tiens au courant demain.

    Thomas

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    Oui, bonne idée le contrôle du nom de domaine:
    http://fr.php.net/manual/fr/function.gethostbyname.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!gethostbyname(str_replace('@', '', strstr($email, '@'))))
      exit('votre domaine existe pas!');

    ça doit être quelque chose comme ça...

  12. #12
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 271
    Points
    271
    Par défaut
    Citation Envoyé par juJuv51
    Oui, bonne idée le contrôle du nom de domaine:
    http://fr.php.net/manual/fr/function.gethostbyname.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!gethostbyname(str_replace('@', '', strstr($email, '@'))))
      exit('votre domaine existe pas!');

    ça doit être quelque chose comme ça...
    Voila

    Dernier détail, sur mon forum, j'interdit aussi les adresse en jetable.org et hotmail.com mais bon la c'est de la parano (quoi que le premier...)

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    Oui, le premier c'est clairement pour définir un forum qui pour le nouveau membre risque d'être jetable!

    il existe tellement de domaine de mail gratuit (caramail, yahoo, live, ....), que je pense qu'il faudrait crée une liste de ceux que tu autorises uniquement :p

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 142
    Points : 83
    Points
    83
    Par défaut Re
    ok merci pour toutes vos remarques :

    voici ce que donne le code actuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <?php
    $name = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['name']); 
     
    $email = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['email']); 
    function isemail($email) {
    $regexp="/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i";
      	if ( !preg_match($regexp, $email) ) return false;
    	return true;
    }
    if(!isemail($email)){exit('votre mail est foiré');}
     
    $city = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['city']); 
    $country = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['country']); 
    $comments = preg_replace("`\\\x00|\\\x0a|\\\x0d|\\\x1a`", "", $_POST['comments']); 
     
    $messageToSend .= "\n";
    $messageToSend .= "Nom : ".addslashes($name)."\n";
    $messageToSend .= "Ville : ".addslashes($city)."\n";
    $messageToSend .= "Pays : ".addslashes($country)."\n";
    $messageToSend .= "Message : ".addslashes($comments)."\n";
     
    // envoyer message
    $to = "ma083028@skynet.be";
    $subject = "Guestbook site FR";
    $from = "From: ".addslashes($email)."\r\n";
     
    mail($to, $subject, $messageToSend, $from);
     
    ?>

    Serait-ce bien efficace ?

    Merci et bonne soirée

  15. #15
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 271
    Points
    271
    Par défaut
    heu le exit c'etait un exemple, affiche un message correcte quand meme

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 142
    Points : 83
    Points
    83
    Par défaut
    non ce n'est pas grave, j'ai laissé ton exemple.
    Si ce sont des gens malvaillants, ben tant pis pour eux !!

    les autres formulaires valides ne verront pas ce message, et c'est cela le plus important !

  17. #17
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 271
    Points
    271
    Par défaut
    Citation Envoyé par tomguiss
    non ce n'est pas grave, j'ai laissé ton exemple.
    Si ce sont des gens malvaillants, ben tant pis pour eux !!

    les autres formulaires valides ne verront pas ce message, et c'est cela le plus important !
    ça arrive de se planter, par exemple, si le gars met toto@@toto.com hop il va se faire jeter, donc faut quand même faire un jolie contrôle, en représentant le formulaire et en affichant "email incorrecte".

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    je pense avoir mi un \ de trop lors des testes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    $name = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['name']); 
     
    $email = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['email']); 
    function isemail($email) {
    $regexp="/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i";
      	if ( !preg_match($regexp, $email) ) return false;
    	return true;
    }
    if(!isemail($email)){exit('votre mail est foiré');}
     
    $city = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['city']); 
    $country = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['country']); 
    $comments = preg_replace("`\\x00|\\x0a|\\x0d|\\x1a`", "", $_POST['comments']); 
     
    $messageToSend .= "\n";
    $messageToSend .= "Nom : ".addslashes($name)."\n";
    $messageToSend .= "Ville : ".addslashes($city)."\n";
    $messageToSend .= "Pays : ".addslashes($country)."\n";
    $messageToSend .= "Message : ".addslashes($comments)."\n";
     
    // envoyer message
    $to = "ma083028@skynet.be";
    $subject = "Guestbook site FR";
    $from = "From: ".addslashes($email)."\r\n";
     
    mail($to, $subject, $messageToSend, $from);
     
    ?>
    il faudrait testé si c'est bien efficace avec seulement \\ (normalement oui)

  19. #19
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    ton truc des preg c'est pas terrible dans le corps du message t'auras plus aucun retours à la ligne (D'autant plus que la fonction mail(), à vérifier, est censée déjà vérifier le paramètre 'message').
    Bye
    Vive les roues en pierre

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    je ne pense pas que mail contrôle lui même les saisies:
    http://www.securephpwiki.com/index.php/Email_Injection

    preg_replace contrôle les saisies une à une, le corps du message est formaté de façon à n'avoir que ses saut à la ligne (et pas les saut à la ligne de saisie qui ne devrais pas en avoir)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $messageToSend .= "\n";
    $messageToSend .= "Nom : ".addslashes($name)."\n";
    $messageToSend .= "Ville : ".addslashes($city)."\n";
    $messageToSend .= "Pays : ".addslashes($country)."\n";
    $messageToSend .= "Message : ".addslashes($comments)."\n";
    mais pour la variable $comments, il est vraie que ça supprimera ses sauts de lignes,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $comments = preg_replace("`\\x00|\\\x1a`", "", $_POST['comments']);
    $comments = preg_replace("`\\x0d\\x0a|\\x0a|\\x0d`", "\n", $_POST['comments']);
    Voilà qui devrait remplacé tout les types de saut de ligne (\r\n | \r | \n) en simple \n.

Discussions similaires

  1. Mon envoi de mail fonctionne mais envoi 5 mail
    Par blinkman04 dans le forum Langage
    Réponses: 0
    Dernier message: 17/04/2013, 11h37
  2. Réponses: 1
    Dernier message: 13/01/2008, 12h52
  3. [Mail] Problème d'envoi de mail avec pièces jointes
    Par nelly644 dans le forum Langage
    Réponses: 2
    Dernier message: 31/03/2007, 10h14
  4. [Mail] envoi d'email avec php à l'aide de blat
    Par lahlousimo dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 11h30
  5. Réponses: 1
    Dernier message: 11/07/2006, 22h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo