Formulaire contact, sur site auto-hébergé

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 : Formulaire contact, sur site auto-hébergé

Re: Formulaire contact, sur site auto-hébergé

par two3d » 25 mars 2021, 21:25

"remplir interpreté par le serveur, on peut y injecté qqch ?"

oui, la règle est de ne jamais faire confiance à ce que l'utilisateur renseigne, c'est valable aussi pour les GET dans l'URL et aussi valable pour les fonctions/variables que tu utilise comme par exemple le PHP_SELF de $_SERVER

Tous les champs doivent être validés par toi, être sûr qu'ils contiennent les données voulues et seulement les données voulues, ou refuser la soumission si ça correspond pas aux critères mis en place par toi.

Je fais la vérification avec des preg_match car j'aime bien savoir qu'est ce que j'autorise ou pas, certains font avec filter_var(), mais perso, comme je ne sais pas ce que fait exactement ces fonctions quand PHP se compile je préfère preg_match() et utiliser mes paternes.

Ne jamais négliger quoi que ce soit, car de nos jours ce sont des robots que te passe dessus en vérifiant toutes les méthodes possibles, sur chaque page, et en 2 minutes il te trouve ce qu'il peut.

Re: Formulaire contact, sur site auto-hébergé

par RealJesus » 25 mars 2021, 19:50

Pas trop sec ? :D si tu as besoin d'aide n'hésites pas!
donc, en gros, si j'ai bien compris ce que j'viens de lire sur le web en faisant une recherche rapide sur "formulaire contact php sécurisé", il faut en plus que je me fade du sql ? :D 8-| 8-| :non2: sérieux ? :D

Re: Formulaire contact, sur site auto-hébergé

par RealJesus » 25 mars 2021, 19:37

Pas trop sec ? :D
euh, wait ? whaaaaaat ? :?:
si tu as besoin d'aide n'hésites pas!
du coup j'ai une question !
si j'pousse le raisonnement, c'est valable pour tout les champs ? pas que pour le subject , non ?
dès qu'il y a un champs qu'on peut remplir interpreté par le serveur, on peut y injecté qqch ?

Re: Formulaire contact, sur site auto-hébergé

par two3d » 25 mars 2021, 18:48

Pas trop sec ? :D si tu as besoin d'aide n'hésites pas!

Re: Formulaire contact, sur site auto-hébergé

par RealJesus » 25 mars 2021, 18:42

J'ai déjà donné l'idée, changer de code, il est vraiment pas top (c'est d'un foutage de gueule royale ce bout de code) avec des variables qui ne servent à rien, ça fait que rallonger le code et on y comprend rien. Ya aussi des vérifications qui sont pas géniales comme
$previsualiser= htmlentities($_POST['previsualiser']);
Si $_POST['previsualiser'] n'existe pas, yaura une erreur

et d'autre qui ne servent à rien comme if(!$DomaineMailExiste)


Et aussi:
$message=str_replace('&', 'et',$message); 
//qui ne sert à rien car passage au htmlentities() de $message
 
Autre chose, si la personne rentre des caractères pour le Subject:'.$objet." (ou le code qui convertit caractères) qui ne sont pas compatible avec la rfc2047 tu laura dans l'os et le mail pourra: soit ne pas te parvenir, soit atterrir en spam, le mieux est de mettre le sujet prédéfinit: par exemple: "Vous avez reçu un nouveau mail"
'Sent:'.date('l, F d, Y H:i');//sert à rien
echo '<p>Tous les champs sont vides.</p>';  
 $message='';$votremail='';$objet='';$apercu_resultat='';

//si ils sont vides ça sert à rien de les redéfinir en vide...
echo $_SERVER['PHP_SELF']; //peut être une faille de sécurité, mettre directement le fichier utilisé, par exemple "contact.php"
https://www.j0k3r.net/un-exemple-basiqu ... sur-server

Bref! ce code est à refaire ou à remplacer par un autre et c'est pas ce qui manque sur internet. :wink:
Pfiouuuu ok, je supprime de ce pas ce bout de code trouvé sur le net !
grâce à toi, j'ai un peu mieux compris la structure et l'échange entre phpmail et le formulaire (c'est mes tous premiers pas en php)

du coup, ouais, j'vais supprimer l'objet et le prédéfinir.

merci bcp pour ton aide :)

je garde le post ouvert si jamais, mais franchement : reconnaissance éternelle ! :D

Re: Formulaire contact, sur site auto-hébergé

par two3d » 25 mars 2021, 18:12

J'ai déjà donné l'idée, changer de code, il est vraiment pas top (c'est d'un foutage de gueule royale ce bout de code) avec des variables qui ne servent à rien, ça fait que rallonger le code et on y comprend rien. Ya aussi des vérifications qui sont pas géniales comme
$previsualiser= htmlentities($_POST['previsualiser']);
Si $_POST['previsualiser'] n'existe pas, yaura une erreur

et d'autre qui ne servent à rien comme if(!$DomaineMailExiste)


Et aussi:
$message=str_replace('&', 'et',$message); 
//qui ne sert à rien car passage au htmlentities() de $message
 
Autre chose, si la personne rentre des caractères pour le Subject:'.$objet." (ou le code qui convertit caractères) qui ne sont pas compatible avec la rfc2047 tu laura dans l'os et le mail pourra: soit ne pas te parvenir, soit atterrir en spam, le mieux est de mettre le sujet prédéfinit: par exemple: "Vous avez reçu un nouveau mail"
'Sent:'.date('l, F d, Y H:i');//sert à rien
echo '<p>Tous les champs sont vides.</p>';  
 $message='';$votremail='';$objet='';$apercu_resultat='';

//si ils sont vides ça sert à rien de les redéfinir en vide...
echo $_SERVER['PHP_SELF']; //peut être une faille de sécurité, mettre directement le fichier utilisé, par exemple "contact.php"
https://www.j0k3r.net/un-exemple-basiqu ... sur-server

Bref! ce code est à refaire ou à remplacer par un autre et c'est pas ce qui manque sur internet. :wink:

Re: Formulaire contact, sur site auto-hébergé

par RealJesus » 25 mars 2021, 17:35

1 /comment éviter que Le mail que je reçois, arrive forcément dans les spams, avec marqué :


Traitez ce message avec prudence
Gmail n'a pas pu vérifier que ce message provient bien de [email protected]. Évitez de cliquer sur des liens ou de télécharger des pièces jointes que ce message pourrait contenir, ou de communiquer des informations personnelles en y répondant.

Signaler comme hameçonnage
J'ai fait un test tout bête : envoyer un mail depuis le formulaire avec un @mail du même domaine que mon smtp @free.fr, et là c'est pas marqué comme spam par gmail

je pense que le pb vient de là : un smtp @free.fr qui envoie un message à la place d'un smtp @gmail.com, et forcément, ça aime pas.

une idée ?

Re: Formulaire contact, sur site auto-hébergé

par RealJesus » 25 mars 2021, 16:55

Tu rajoute une condition:
if(isset(post previsualiser)) 
//alors tu affiche la prévisualisation
else 
// tu envoi le message
Penses à réafficher les champs du formulaire quand tu fait une prévisualisation car il seront vidés automatiquement
alors j'avoue, j'm'y perds dans tout ce code, mais il me semble que c'est déjà le cas, non avec : elseif(!empty($previsualiser)) ?
  //Si les deux sont pleins et que l'adresse est valide, on envoie on on prévisualise sans envoi  
    else  
      {  
        $domaine=preg_replace('#[^@]+@(.+)#','$1',$votremail);  
        $DomaineMailExiste=checkdnsrr($domaine,'MX');  
        if(!$DomaineMailExiste)  
          echo'<p>Le nom de domaine de l\'adresse e-mail que vous avez donné n\'existe pas.</p>';  
        elseif(!empty($previsualiser))  
            {  
              $apercu_resultat='<p>Votre message et votre adresse e-mail sont valides et prêts à être envoyés.  
              <br>Vous n\'avez plus qu\'à cliquer sur le bouton "Envoyer".<br>Prévisualisation :</p>';  
              $Previsualiser='';  
            }  
        elseif(!empty($envoi))  
            {  
              $objet='[envoyé depuis mon site web] : '.$objet;  
              $headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type:text/plain;charset=iso-8859-1'."\r\n".'Sent:'.date('l, F d, Y H:i');  
              if(mail($destinataire,$objet,$message,$headers))  
              {  
                echo '<p>Votre message a bien été envoyé. Merci.</p><p><a href="/">Retour à la page d\'accueil</a></p>';  
                $Envoi='';  
                $Previsualiser='';  
              }  
              else  
                echo'<p>Un problème est survenu durant l\'envoi du mail.</p>';  
            }  
        else  
          echo'<p>Une condition innatendue est survenue lors de l\'exécution du script.</p>';  
      }  
echo $apercu_resultat;  
  }  

Re: Formulaire contact, sur site auto-hébergé

par two3d » 25 mars 2021, 16:01

Tu rajoute une condition:
if(isset(post previsualiser)) 
//alors tu affiche la prévisualisation
else 
// tu envoi le message
Penses à réafficher les champs du formulaire quand tu fait une prévisualisation car il seront vidés automatiquement

Re: Formulaire contact, sur site auto-hébergé

par RealJesus » 25 mars 2021, 15:43

Utiliser un mail() en utf8 et faire en sorte que le sujet du message soit aussi correct.
c'est fait, mais même en tapant "demande de devis" plutôt que "test" en sujet, c'est pareil... j'ai créé un filtre sur ma boite mail (puisque j'ai ajouté en dur dans le code "envoyé depuis mon site web" pour éviter que ça aille dans les spams.

Par contre, tu aurais une piste (pour un débutant) pour sécuriser un peu le formulaire et éviter de me faire spamm pour rien ?
Tu assignes des boutons à $Previsualiser et $Envoi, les boutons en questions, que tu réaffiche en bas du form avec $bas_formulaire, supprime carrément <?php echo $bas_formulaire;?> (vers la ligne 664) et suppriome aussi enctype="multipart/form-data" (dans la balise <form ... enctype="multipart/form-data">) qui ne te servira pas pour ton utilisation.
c'est fait aussi, mais j'ai corrigé comme suit :
<?php  
                 if (isset($_POST['message']))  
                  {  
                    // La variable $verif va nous permettre d'analyser si la sémantique de l'email est bonne  
                    $verif='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#';  
                    //quelques remplacements pour les specialchars  
                    $message=preg_replace('#(<|>)#', '-', $_POST['message']);  
                    $message=str_replace('"', "'",$message);  
                    $message=str_replace('&', 'et',$message);  
                    $objet=preg_replace('#(<|>)#', '-', $_POST['objet']);  
                    $objet=str_replace('"', "'",$objet);  
                    $objet=str_replace('&', 'et',$objet);  
                    // On assigne et/ou protège nos variables  
                    $votremail=stripslashes(htmlentities($_POST['votremail']));  
                    $message=stripslashes(htmlspecialchars($message));  
                    $objet=stripslashes(htmlspecialchars($objet));  
                    //input envoi/previsualiser  
                    $envoi=htmlentities($_POST['envoi']);  
                    $previsualiser=htmlentities($_POST['previsualiser']);  
                    //on enlève les espaces  
                    $votremail=trim($votremail);  
                    $message=trim($message);  
                    $objet=trim($objet);  

                    $apercu_resultat='<p>Aperçu du résultat :</p>';  

                    /*On vérifie si l'e mail et le message sont pleins, et on agit en fonction.  
                      (on affiche Apercu du resultat, tel ou tel champ est vide, etc...*/  
                    //Si ca ne vas pas (mal rempli, mail non valide...)  
                    if((empty($message))or(empty($objet))or(!preg_match($verif,$votremail)))  
                      {  
                        //les 3 champs sont vides  
                        if(empty($votremail)and(empty($message))and(empty($objet)))  
                          {  
                            echo '<p>Tous les champs sont vides.</p>';  
                            $message='';$votremail='';$objet='';$apercu_resultat='';  
                          }  
                        //un des champs est vide  
                        else  
                          {  
                            if(!preg_match($verif,$votremail))  
                              echo'<p>Votre adresse e-mail n\'est pas valide.</p>';  
                            else  
                            {  
                              echo'<p>Il faut remplir tous les champs !</p>';  
                              if(empty($message))  
                                $apercu_resultat='';  
                            }  
                          }  
                      }  
                    //Si les deux sont pleins et que l'adresse est valide, on envoie ou on prévisualise sans envoi  
                    else  
                      {  
                        $domaine=preg_replace('#[^@]+@(.+)#','$1',$votremail);  
                        $DomaineMailExiste=checkdnsrr($domaine,'MX');  
                        if(!$DomaineMailExiste)  
                          echo'<p>Le nom de domaine de l\'adresse e-mail que vous avez donné n\'existe pas.</p>';  
                        elseif(!empty($previsualiser))  
                            {  
                              $apercu_resultat='<p>Votre message et votre adresse e-mail sont valides et prêts à être envoyés.  
                              <br>Vous n\'avez plus qu\'à cliquer sur le bouton "Envoyer".<br>Prévisualisation :</p>';  
                              $Previsualiser='';  
                            }  
                        elseif(!empty($envoi))  
                            {  
                              $objet='[envoyé depuis mon site web] : '.$objet;  
                              $headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type: text/html; charset=UTF-8'."\r\n".'Sent:'.date('l, F d, Y H:i');  
                              if(mail($destinataire,$objet,$message,$headers))  
                              {  
                                echo '<p>Votre message a bien été envoyé. Merci.</p><p><a href="/">Retour à la page d\'accueil</a></p>';  
                                $Envoi='';  
                                $Previsualiser='';  
                              }  
                              else  
                                echo'<p>Un problème est survenu durant l\'envoi du mail.</p>';  
                            }  
                        else  
                          echo'<p>Une condition innatendue est survenue lors de l\'exécution du script.</p>';  
                      }  
                echo $apercu_resultat;  
                  }  
                else  
                  {  
                  echo '<p>Vous pouvez utiliser ce formulaire pour me contacter.</p>';  
                  $votremail='';$message='';  
                  }  
                ?>
                 <form id="myForm" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
                    <div class="input-line">
                        <input  id="name" type="text" placeholder="Name" class="input-name" name="Name" value="<?php echo( $from ); ?>" name="from" required>
                        <input id="email" type="email" placeholder="Email"  class="input-name" value="<?php echo $votremail; ?>" name="votremail" required>
                    </div>
                    <input type="text" id="subject" placeholder="subject" class="input-subject" value="<?php echo( $object ); ?>" name="objet" required>
                    <textarea id ="body" class="input-textarea" placeholder="message" name="message" required><?php echo $message; ?></textarea>
                    <button name="envoi" type="submit" id ="submit" tabindex="4" value="Envoyer">Envoyer</button>
                    <button type="submit" name="previsualiser" tabindex="3" value="Prévisualiser">Prévisualiser</button>
                 </form>
donc du coup, le bouton envoyer fonctionne, mais pas le bouton prévisualiser.... any hint ?

Encore une fois, merci, you rock ! :)

Re: Formulaire contact, sur site auto-hébergé

par two3d » 25 mars 2021, 14:33

1 /comment éviter que Le mail que je reçois, arrive forcément dans les spams, avec marqué :
Utiliser un mail() en utf8 et faire en sorte que le sujet du message soit aussi correct.
2/ comment faire pour que l'envoie se fasse depuis le boutton de mon formulaire, et non depuis les boutons "prévisualiser" et "envoyer" du script php ?
Tu assignes des boutons à $Previsualiser et $Envoi, les boutons en questions, que tu réaffiche en bas du form avec $bas_formulaire, supprime carrément <?php echo $bas_formulaire;?> (vers la ligne 664) et suppriome aussi enctype="multipart/form-data" (dans la balise <form ... enctype="multipart/form-data">) qui ne te servira pas pour ton utilisation.

Re: Formulaire contact, sur site auto-hébergé

par RealJesus » 25 mars 2021, 12:06

Ta aucun name sur tes input, tu ne peux pas les retrouver avec $_POST lors du traitement PHP

sauf textarea qui a un name="message"
Effectivement, merci ^^ ça envoie bien le mail et je le reçois....

du coup, j'ai deux autres questions :

1 /comment éviter que Le mail que je reçois, arrive forcément dans les spams, avec marqué :


Traitez ce message avec prudence
Gmail n'a pas pu vérifier que ce message provient bien de [email protected]. Évitez de cliquer sur des liens ou de télécharger des pièces jointes que ce message pourrait contenir, ou de communiquer des informations personnelles en y répondant.

Signaler comme hameçonnage

2/ comment faire pour que l'envoie se fasse depuis le boutton de mon formulaire, et non depuis les boutons "prévisualiser" et "envoyer" du script php ?
rien ne se passe quand je clique sur le bouton de mon formulaire
Merci bcp pour ton aide, en tout cas :)

Re: Formulaire contact, sur site auto-hébergé

par two3d » 25 mars 2021, 11:43

Ta aucun name sur tes input, tu ne peux pas les retrouver avec $_POST lors du traitement PHP

sauf textarea qui a un name="message"

Re: Formulaire contact, sur site auto-hébergé

par RealJesus » 25 mars 2021, 11:26

J'ai fait, mais du coup plus rien ne fonctionne : j'ai juste mon nom sur la page et plus accès au menu, et tout le reste... et je ne reçois pas le mail non plus

Re: Formulaire contact, sur site auto-hébergé

par two3d » 24 mars 2021, 16:31

essaye en enlevant <script src="https://cdnjs.cloudflare.com/ajax/libs/ ... "></script>

Et "enctype form data" n'est pas utile pour ton <form> si tu n'envoie pas de fichier.