OVH Community, votre nouvel espace communautaire.

spams et fonction mail() php dans fichier .php


Abazada
19/07/2013, 11h10
Citation Envoyé par VienenDelSur
Je ne sais pas si la solution sera suffisante.
En théorie rien ne vaut un filtrage sévère de chaque variable. En pratique pour les anti-injections sur formulaires, la détection des saut de lignes m'a toujours suffi.

Perso je fais un preg_match, pas un preg_replace et je jette carrément la demande d'envoi de mail quand je détecte ces \r ou \n

Par-contre ton preg devrait être sur les variables qui sont utilisées pour construire ton $entete, pas sur $entete lui-même qui peut légitimement contenir plusieurs lignes.

VienenDelSur
19/07/2013, 09h28
Bon

après avoir réfléchi un peu nous avons testé et mis en commentaire la ligne suivante et dès lors nous n'avons plus les courriels signalés en [SPAM] par ovh
Code PHP:
//$message = preg_replace("([\r\n])", "", $message); // passe nos mails en [SPAM] chez ovh à vérifier
            
$entete preg_replace("([\r\n])"""$entete); //enlève les retours charriots et les sauts de ligne ds en-tête 
Je n'ai plus ce problème de lisibilité des messages, mais il faut quand même surveiller que la boîte n'est pas spamée de nouveau.
Je ne sais pas si la solution sera suffisante.

VienenDelSur
11/07/2013, 13h40
Salut et merci bien.

Le doc a été corrigé ; voilà le code :

Code PHP:
if(isset($_POST['nom'])){
    
    
$code=$_POST['code'];//code captcha **************************

    
$nom=$_POST['nom']; // on récupère toutes les variables pour ré écrire les champs
    
$prenom=$_POST['prenom'];
    
$telephone=$_POST['telephone'];
    
$mail=$_POST['mail'];
    
$fax=$_POST['fax'];
    
$pays=$_POST['pays'];
    
$texte=$_POST['texte'];
    
$date=$_POST['date'];
    
$date2=$_POST['date2'];
    
$nombredepersonne=$_POST['nombredepersonne'];
    
$couchage=$_POST['couchage'];
    
$quartier=$_POST['quartier'];
    
$quartier2=$_POST['quartier2'];
    
$quartier3=$_POST['quartier3'];
    
$texte=$_POST['texte'];     
        
    if(
$code != $_SESSION['chaine']){ // comparaison avec la var de session
        
$avert'Merci de recopier le bon code !'

        
// si c'est pas le bon code message s'affiche
    
}else{
        
$avert=''// avertissement vide

        
$erreur "";
        if(
$_POST['nom'] == "")
            
$erreur .= "Le nom est obligatoire. ";
        if(
$_POST['telephone'] == "")
            
$erreur .= "Merci de donner un telephone. ";
        if(
$_POST['mail'] == "")
            
$erreur .= "Votre adresse e-mail est obligatoire. ";
        if(
$_POST['texte'] == "")
            
$erreur .= "Precisez votre demande d'informations. ";
        if(
$_POST['date'] == "")
            
$erreur .= "Precisez votre date d'arrivee souhaitee. ";
        if(
$_POST['date2'] == "")
            
$erreur .= "Precisez votre date de depart souhaitee. ";
       if(
$_POST['nombredepersonne'] == "")
            
$erreur .= "Precisez le nombre de personne. ";
        if(
$_POST['couchage'] == "")
            
$erreur .= "Precisez le type de couchage. ";
        if(
$_POST['quartier'] == "")
            
$erreur .= "Quel quartier vous interesse. ";
    
        if(
$erreur !=""){
            echo 
$erreur;
        }else{
//pas d'erreur
            
$message .= "Message envoye depuis www.goodmorningparis.fr SITE FRANCE \n\n";
            
$message .= "Nom : ".$nom."\n";
            
$message .= "Prenom : ".$prenom."\n";
            
$message .= "Telephone : ".$telephone."\n";
            
$message .= "Fax : ".$fax."\n";
            
$message .= "E-mail : ".$mail."\n";
            
$message .= "Pays: ".$pays."\n";
            
$message .= "Date d'arrivee : ".$date."\n";
            
$message .= "Date de depart : ".$date2."\n";
            
$message .= "Nombre de personne : ".$nombredepersonne."\n";
            
$message .= "Couchage : ".$couchage."\n\n";
            
$message .= "Quartier : ".$quartier."\n\n";
            
$message .= "Quartier choix 2 : ".$quartier2."\n\n";
            
$message .= "Quartier choix 3 : ".$quartier3."\n\n";
            
$message .= "Demande : ".$texte."\n";

            
$entete "From: ".$nom." <".$mail.">\n"
            
            
$message preg_replace("([\r\n])"""$message);
            
$entete preg_replace("([\r\n])"""$entete);
            
            
//contre injection
            
$match "/(bcc:|cc:|content\-type:)/i";
            if (
preg_match($match$entete) || preg_match($match$message)) {
              die(
"injection entete detectee.");
            }else{
                if( 
mail('booking@goodmorningparis.fr''GoodMorningParis'$message$entete)){
                    
header("location: confirmation.php");
                    exit();
                }else{
                    echo 
"Erreur lors de l'envoi du mail."// renvoyer vers autre page
                
}
            }
        }
    }

Qu'est-ce que vous en pensez ?

D'autre part nous n'avons pas protégé les saisies des champs (addslashes) car il n'y a pas de connexions à la BDD (injection SQL).

J'ai trois fois le même script, sur les pages dans les 3 langues du site ; le test en français revient ok et ainsi que celui en allemand, celui en anglais affiche dans l'en-tête du webmail :
Code:
Objet 	[SPAM] GoodMorningParis
Le courriel est déclaré comme SPAM et cela empêche les retours à la ligne dans le mail et gêne la lecture du contenu pour la personne qui les réceptionne. Comment est-ce possible et comment y remédier ? avez-vous une idée ?

Merci encore de votre aide.

Merci de votre aide

VienenDelSur
08/07/2013, 09h57
Citation Envoyé par cavapulser
Pour ma part, j'utilise ce script depuis longtemps (sans le reCAPTCHA proposé, en plus), et il a l'air plutôt bien sécurisé...
http://aspirine.org/contact/

(Enfin, pas eu de mauvaises surprises jusqu'à maintenant, et je croise les doigts)
Merci je vais regarder cela attentivement.

VienenDelSur
08/07/2013, 09h55
Merci beaucoup pour tous ces éclaircissements

Citation Envoyé par Abazada
Le Captcha "peut" limiter, voire même supprimer, l'utilisation de ton formulaire via un robot. Ca dépend beaucoup du Captcha.
Pour les solutions Captcha les plus utilisées, les spammeurs disposent de softs assez perfectionnés qui en résolvent pas mal
Pour ceux qui peuvent payer un peu, il existe des solutions on l'on demande à un humain de répondre au captcha. (En général via des sites porno en promettant à l'utilisateur qu'il en verra plus )
Le CAPTCHA mis en place est, comment dire, fait maison. J'ai voulu faire le re-captcha de google mais nous ne le trouvons pas lisibles, un script a donc été fait à la main.

Ce qui n'a pas empêché l'arrivée d'une petite dizaine de SPAMS samedi soir !!

Citation Envoyé par Abazada
Le Captcha limite le nb de formulaires que tu vas accepter/traiter, mais la faille est toujours là, énorme. Chaque fois que quelqu'un (ou un robot) répond positivement à ton Captcha, il a la possibilité de Spammer plusieurs dizaines d'emails au moins...

La vérification de $_POST['mail'] est prioritaire,
mais aussi toutes les variables qui servent à construire $entete

D'une manière générale, il est indispensable de checker/filtrer toutes les variables passées à un script par $_GET, $POST,... ou direct par l'URL
Je dois donc filtrer … je fais cela avec le collègue développeur avec qui nous allons modifier le script.

A plus tard

cavapulser
06/07/2013, 04h09
Pour ma part, j'utilise ce script depuis longtemps (sans le reCAPTCHA proposé, en plus), et il a l'air plutôt bien sécurisé...
http://aspirine.org/contact/

(Enfin, pas eu de mauvaises surprises jusqu'à maintenant, et je croise les doigts)

Abazada
05/07/2013, 17h04
Citation Envoyé par VienenDelSur
Vais-je avoir des soucis encore ou le CAPTCHA peut-il me permettre d'éviter les spams massifs ?
Le Captcha "peut" limiter, voire même supprimer, l'utilisation de ton formulaire via un robot. Ca dépend beaucoup du Captcha.
Pour les solutions Captcha les plus utilisées, les spammeurs disposent de softs assez perfectionnés qui en résolvent pas mal
Pour ceux qui peuvent payer un peu, il existe des solutions on l'on demande à un humain de répondre au captcha. (En général via des sites porno en promettant à l'utilisateur qu'il en verra plus )

Citation Envoyé par VienenDelSur
Dois-je revoir le formulaire quand même ?
Le Captcha limite le nb de formulaires que tu vas accepter/traiter, mais la faille est toujours là, énorme. Chaque fois que quelqu'un (ou un robot) répond positivement à ton Captcha, il a la possibilité de Spammer plusieurs dizaines d'emails au moins...

La vérification de $_POST['mail'] est prioritaire,
mais aussi toutes les variables qui servent à construire $entete

D'une manière générale, il est indispensable de checker/filtrer toutes les variables passées à un script par $_GET, $POST,... ou direct par l'URL

mpam
05/07/2013, 13h46
edit: non rien, j'avais pas vu que le ménage n'était pas fait...

VienenDelSur
05/07/2013, 13h31
ok

je vais regarder cela en détail.

mais sur le point 1. de Abazada
>>>> Le formulaire en question à changé, j'ai mis, avec un collègue, un CAPTCHA maintenant ; http://www.goodmorningparis.fr/fr/reservations.php

Mais la "base" du formulaire est la même !! Vais-je avoir des soucis encore ou le CAPTCHA peut-il me permettre d'éviter les spams massifs ? Dois-je revoir le formulaire quand même ?

ah là là

Nowwhat
05/07/2013, 13h31
Citation Envoyé par Abazada
Code PHP:
function EnvoyerMail($nom$mail
...
$entete .= "Reply-To: ".$mail."\n";
...
EnvoyerMail($_POST['nom'], $_POST['mail'], ... 
C'est beau ça

Gaston_Phone
05/07/2013, 11h12
Zut! Abazada m'a devancé et ... mieux répondu que moi.

Abazada
05/07/2013, 10h54
Code PHP:
function EnvoyerMail($nom$mail
...
$entete .= "Reply-To: ".$mail."\n";
...
EnvoyerMail($_POST['nom'], $_POST['mail'], ... 
Et zut! J'avais encore raison !

Il n'y a tout simplement AUCUNE sécurité sur ton formulaire

Tel qu'il est là je peux, en plaçant mes propres instructions Header dans le champ 'mail', envoyer à chaque appel des 100aines de mails à des @mail différentes (via un Bcc: en plus) et avec un contenu tout diffèrent du tient ...

En gros ton formulaire est une porte ouverte pour les #@$%! spammeurs...

Je te conseille vivement de :
1- désactiver provisoirement ce formulaire
2- consulter Google ou ce forum sur "anti injection header SPAM"...
3- ajouter les tests minimum nécessaires sur tes variable $_POST ou $_GET

Au travail

VienenDelSur
05/07/2013, 10h27
Citation Envoyé par Gaston_Phone
Je ne vois rien qui ne provienne pas de OVH.

Es-tu sur un 90 plan ?

Le courriel a été envoyé :
  • soit depuis ton site (faille sur ton site),
  • soit depuis le site d'une tierce personne et également hébergé chez OVH.
Bonjour !

Je suis sur un 90plan effectivement ; qu'est-ce que cela implique par rapport à tes remarques.

et s'il y a une faille sur mon site comment la trouver ?

fritz2cat
04/07/2013, 13h12
Tu as un formulaire et les hackeurs de tout poil s'amusent avec.

En plus ils essayent de trouver des SQL injections (Date d'arrivee : -1" or "104"="0)

Si chaque appel de ton formulaire t'envoie un mail, effectivement ça fait un peu mal quand on bruteforce

Frédéric

Gaston_Phone
04/07/2013, 12h31
Je ne vois rien qui ne provienne pas de OVH.

Es-tu sur un 90 plan ?

Le courriel a été envoyé :
  • soit depuis ton site (faille sur ton site),
  • soit depuis le site d'une tierce personne et également hébergé chez OVH.

VienenDelSur
04/07/2013, 10h58
Hello

Voici l'en-tête de l'un des messages reçu lors de la dernière "attaque" si c'en est une, j'en ai conservé un autre qui me semble identique dans l'en-tête
Code:
id=d170=u32710.90plan.ovh.net=1371659810347265861@93.mail-out.ovh.net>
Delivered-To: reservation@goodmorningparis.fr
Received: from b0.ovh.net (HELO queue) (213.186.33.50)
	by b0.ovh.net with SMTP; 19 Jun 2013 19:31:34 +0200
Received: from 93.mail-out.ovh.net (178.33.45.190)
  by mx1.ovh.net with SMTP; 19 Jun 2013 19:31:32 +0200
Received: (qmail 18026 invoked by uid 0); 19 Jun 2013 17:31:29 -0000
Received: from gw0.ovh.net (HELO 90plan.ovh.net) (213.251.189.200)
  by 93.mail-out.ovh.net with SMTP; 19 Jun 2013 16:36:50 -0000
Received: from localhost.localdomain (localhost [127.0.0.1])
	by localhost.domain.tld (Postfix) with ESMTP id 6D44D1A39D
	for ; Wed, 19 Jun 2013 18:36:42 +0200 (CEST)
Received: by 90plan.ovh.net (Postfix, from userid 32710)
	id 5177B1A492; Wed, 19 Jun 2013 18:35:43 +0200 (CEST)
To: reservation@goodmorningparis.fr
Subject: GoodMorningParis
From: jrubcvyy 
Reply-To: sample@email.tst
MIME-version: 1.0
Content-type: text/plain; charset= iso-8859-1
Message-Id: <20130619163543.5177B1A492@90plan.ovh.net>
Date: Wed, 19 Jun 2013 18:35:43 +0200 (CEST)
X-Ovh-Tracer-Id: 16006356027370477307
X-Ovh-Remote: 178.33.45.190 (93.mail-out.ovh.net)
X-Ovh-Local: 213.186.33.29 (mx1.ovh.net)
X-OVH-SPAMSTATE: OK
X-OVH-SPAMSCORE: 50
X-OVH-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeeiiedrjeduucetufdoteggodetrfcurfhrohhfihhlvgemucfqggfjnecuuegrihhlohhuthemuceftddtnecuogetvdelhedqtdekucdlhedtmd
X-Spam-Check: DONE|U 0.5/N

Message envoye depuis www.goodmorningparis.fr SITE ANGLAIS 

Nom : jrubcvyy
Prenom : jrubcvyy
Telephone : 555-666-0606
Fax : 317-317-3137
E-mail : sample@email.tst
Pays: Australia
Date d'arrivee : -1" or "104"="0
Date de depart : 01/01/1967
Nombre de personne : jrubcvyy
Couchage : Indifférent

Quatier : IndiffÈrent/no preference

Quartier choix 2 : IndiffÈrent/no preference

Quartier choix 3 : IndiffÈrent/no preference

Demande : 1

Gaston_Phone
04/07/2013, 10h34
Citation Envoyé par VienenDelSur
Sur des formulaires qui renvoyaient vers un fichier mail.php, avec la fonction mail() pour faire le message, nous avons eu une quantité incroyable de spams : + de 6000 en une soirée.
  • Soit ton site a été hacké.
  • Soit quelqu'un envoie des courriels en utilisant ton adresse MAIL comme adresse émetteur et retour.

Seule l'analyse du source d'un courriel douteux reçu permettra de pousser le diagnostique plus loin.

VienenDelSur
04/07/2013, 10h25
Bonjour et merci de cette réponse, désolé mais je n'ai pas eu le temps de répondre hier.

le code du doc .php qui fabriquait le courriel le voilà :
Code PHP:

function EnvoyerMail($nom$mail$destinataire$sujet$corps$html="non")
{
    
$entete "From: ".$nom." <".$mail.">\n"// mettre nom et prenom dans from
    
if($html=="oui")
        
$entete .= "Content-type:text/html\n\n"
        
$entete .= "Reply-To: ".$mail."\n";
        
$entete .= "MIME-version: 1.0\n"// deux lignes rajoutés pour que le courriel 
        
$entete .= "Content-type: text/plain; charset= iso-8859-1\n"// ne soit pas considéré comme du spam 
    
return mail($destinataire$sujet$corps$entete);
}

if(isset(
$_POST['nom'])) // enlever les lignes si les champs ne sont pas obligatoires
{
        
$erreur "";
    if(
$_POST['nom'] == "")
        
$erreur .= "Le nom est obligatoire. ";
    if(
$_POST['telephone'] == "")
        
$erreur .= "Merci de donner un telephone. ";
    if(
$_POST['mail'] == "")
        
$erreur .= "Votre adresse e-mail est obligatoire. ";
    if(
$_POST['texte'] == "")
        
$erreur .= "Precisez votre demande d'informations. ";
    if(
$_POST['date'] == "")
        
$erreur .= "Precisez votre date d'arrivee souhaitee. ";
    if(
$_POST['date2'] == "")
        
$erreur .= "Precisez votre date de depart souhaitee. ";
    if(
$_POST['nombredepersonne'] == "")
        
$erreur .= "Precisez le nombre de personne. ";
    if(
$_POST['couchage'] == "")
        
$erreur .= "Precisez le type de couchage. ";
    if(
$_POST['quartier'] == "")
        
$erreur .= "Quel quartier vous interesse. ";
        
        

    if(
$erreur !="")
    {
        echo 
$erreur;
    }
    else 
// comment avoir des lettres accentué dans le texte des messages
    
{
        
$message .= "Message envoye depuis www.goodmorningparis.fr SITE FRANCE \n\n";
        
$message .= "Nom : ".$_POST['nom']."\n";
        
$message .= "Prenom : ".$_POST['prenom']."\n";
        
$message .= "Telephone : ".$_POST['telephone']."\n";
        
$message .= "Fax : ".$_POST['fax']."\n";
        
$message .= "E-mail : ".$_POST['mail']."\n";
        
$message .= "Pays: ".$_POST['pays']."\n";
        
$message .= "Date d'arrivee : ".$_POST['date']."\n";
        
$message .= "Date de depart : ".$_POST['date2']."\n";
        
$message .= "Nombre de personne : ".$_POST['nombredepersonne']."\n";
        
$message .= "Couchage : ".$_POST['couchage']."\n\n";
        
$message .= "Quartier : ".$_POST['quartier']."\n\n";
        
$message .= "Quartier choix 2 : ".$_POST['quartier2']."\n\n";
        
$message .= "Quartier choix 3 : ".$_POST['quartier3']."\n\n";
        
$message .= "Demande : ".$_POST['texte']."\n";
        
        
        if(
EnvoyerMail($_POST['nom'], $_POST['mail'], 'test@goodmorningparis.fr''GoodMorningParis'$message)) // comment recuperer les autres champs du formulaire sans perdre le mail de l'expediteur
        
{
            
header("location: confirmation.php");
            exit();
            
//echo "Merci de votre courriel nous allons étudier votre réservation."; // renvoyer ensuite vers une page ou autre
        
}
        else
        {
            echo 
"Erreur lors de l'envoi du mail."// renvoyer vers autre page
        
}
    }
}


?>
Quand au formulaire ; voici le début du form

Code:
Une copie de tous les SPAMS envoyés ?? diable.

Merci de vos éclaircissements.

Abazada
03/07/2013, 11h50
Difficile de te répondre sans savoir ce que contient ce "mail.php"
ou sans voir au moins la page Html de ton formulaire...

Par contre la question que je me poserais à ta place est :
"Suis-je le seul à recevoir ces Spams ?"
Une des solutions simples d'envoi de Spam,
à l'aide des formulaires mal protégés des autres sites
en fournissant du header en plus du email,
a souvent pour conséquences que l'émetteur par défaut (dans ton code)
se prend une copies de tous les Spams envoyés...
Ca expliquerait la quantité que tu reçois

VienenDelSur
03/07/2013, 10h10
Bonjour à tous

Sur des formulaires qui renvoyaient vers un fichier mail.php, avec la fonction mail() pour faire le message, nous avons eu une quantité incroyable de spams : + de 6000 en une soirée.

L'adresse courriel pour la réception du message et qui était dans le fichier mail.php était également visible sur le site, en toute lettre. J'ai pensé que c'était à cause de cela que les spams pouvaient partir, car l’adresse était, comment dire, publique.

Pour remédier à cela j'ai donc changé l'adresse, dans le fichier mail.php, en mettant une nouvelle adresse, créée à cette occasion. Re-belote ; il y a 15 jours : même problème des spams sans arrêt.

Expliquez-moi : Comment les robots, les programmes ou les spammeurs peuvent-ils trouver une adresse mail dans un fichier .php qui n'est donc a priori pas visible !!

Je mets en place un captcha sur ces formulaires, les scripts .php sont dans le même fichier (avant html), j'ai encore créé une nouvelle adresse mail pour ces nouvelles pages ; est-ce que je risque d'avoir des problèmes ??

merci de votre aide.

Bonne journée