Empêcher rafraîchissement d'un formulaire

Fermé
eleve14 Messages postés 15 Date d'inscription mercredi 28 mai 2014 Statut Membre Dernière intervention 10 mai 2016 - Modifié par jordane45 le 10/05/2016 à 09:33
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 - 10 mai 2016 à 18:11
Bonjour à vous,

Dans le cadre d'un projet d'études, je réalise un site de vente (système de panier, clients, etc.). Le site en lui même fonctionne, il n'y a pas de soucis de ce côté là mais en revanche, j'en suis à la gestion de la sécurité du site et j'aimerais tout simplement empêcher un client (connecté ou non) de renvoyer à l'infini un formulaire qu'il vient d'envoyer comme par exemple, un formulaire de contact => ce qui spammerait la boite mail du détenteur du site.

J'ai essayé via des variables de session mais le problème est que lorsque j'envoie le formulaire, le mail ne s'envoie plus.

Voici mon code :

if(empty($_SESSION['compteur_soumissions']))
    {
     $_SESSION['compteur_soumissions'] = 0;
    }
    else
    {
     if($_SESSION['compteur_soumissions']>0)
     {
      unset($_POST);
      echo '<script type="text/javascript">';
      echo 'swal("Erreur","","Vous avez déjà envoyé ce mail !");';
      echo '</script>';
     }
     else
     {
      if(isset($_POST['btnSubmitContact']))
      {
       $from_add = $_POST['tbxMail']; 
       
       $requete = $bdd->prepare('SELECT tbl_detenteur.adresseEmail AS MAIL FROM tbl_detenteur');
       $requete->execute();
       $requete->setFetchMode(PDO::FETCH_OBJ);
       
       while($ligne=$requete->fetch())
       {
        $to_add = $ligne->MAIL;
       }
       
       $Prenom = $_POST['tbxPrenom'];
       $Objet = $_POST['tbxObjet'];
       
       $subject = $Objet;
       
       $message = $Prenom .  ' dit : ';
       $message .= $_POST['tbxMessage'];
       
       
       $headers = "From: $from_add \r\n";
       $headers .= "MIME-version: 1.0\n";
       $headers .= "Content-type: text/html; charset= \"utf-8\"\n";
       $headers .='Content-Transfer-Encoding: 8bit'; 
       $headers .= "Reply-To: $from_add \r\n";
       $headers .= "Return-Path: $from_add\r\n";
       $headers .= "X-Mailer: PHP \r\n";
       
       
       if(mail($to_add, html_entity_decode($subject, ENT_QUOTES,'UTF-8'), html_entity_decode($message, ENT_QUOTES,'UTF-8'), $headers)) 
       {
        echo '<script type="text/javascript">';
        echo 'swal("Message envoyé !","","success");';
        echo '</script>';
        $_SESSION['compteur_soumissions']++;
       }
       else
       {
        echo '<script type="text/javascript">';
        echo 'swal("Erreur","","Impossible d\'envoyer le mail...!
        ");';
        echo '</script>';
        $_SESSION['compteur_soumissions'] = 1;
       }
      }
     }
    }


Désolé pour l'indentation.... C'est la balise "code" qui a un peu tout déformé =/
Dans l'attente d'une réponse, je vous souhaite à tous, une bonne journée !

Cordialement,

Eleve14

2 réponses

astuces72 Messages postés 7722 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 17 avril 2024 1 637
10 mai 2016 à 09:33
slt

Si tu récupères l'ip du pc qui a envoyé l'email, et que tu l'enregistres dans une base de données ?
Et à chaque envoi de mail, tu contrôles dans la bdd voir si l'ip ne s'y trouve pas, et tu ne l'envoi pas.

Quand tu recevras son email, tu affiches l'ip sous forme de lien avec une fonction de suppression de l'ip de la base.

c'est con ?
0
eleve14 Messages postés 15 Date d'inscription mercredi 28 mai 2014 Statut Membre Dernière intervention 10 mai 2016 1
10 mai 2016 à 10:35
Salut,

Merci de ta réponse et j'essaierai ta solution. J'attends juste d'avoir d'autres réponses et je regarderai celle qui me facilite le plus la tâche mais ta solution pourrait faire l'affaire en cas d'extrême recourt x)

Merci !
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
10 mai 2016 à 18:11
Bonjour,

Les solutions proposées ici te conviendront sans doute :
https://stackoverflow.com/questions/2133964/how-to-prevent-multiple-inserts-when-submitting-a-form-in-php

A savoir :
1 - Désactiver, en javascript, le bouton de validation (de submit) après que l'utilisateur ait cliqué dessus

2 - Ajouter une variable de session contenant l'heure du submit et s'assurer qu'un certain délai (au minima 5 secondes par exemples) se sont écoulés entre les envoies du formulaire par l'utilisateur

3 - Utilisation de Token pour s'assurer que le "submit" est bien unique (un peu ce que tu as cherché à faire avec tes sessions)


Et au cas où, par rapport à ton code actuel :


J'ai essayé via des variables de session mais le problème est que lorsque j'envoie le formulaire, le mail ne s'envoie plus.

- As tu bien mis un session_start() au début de ta page ?
- Affiche les erreurs PHP via la ligne de code :
 error_reporting(E_ALL);
pour t'assurer que ton conde ne contient pas d'erreur.

0