Page 1 sur 1

impossible de faire fonctionner mon captcha de façon correcte

Posté : 30 déc. 2021, 09:31
par flexi2202
bonjour a tous
je pensais avoir fini mon site
Mais je suis ennuyé par de petits malins robots qui m envoie des spams dans mon formulaire de contact
je dois donc intervenir et y placer un captcha

je viens de trouver un tuto a cette page qui me plais bien
https://palmi.smileandjoke.fr/php-captc ... eponses-29

Mais le soucis que je rencontre est que je rentre un bon ou un mauvais captcha le formulaire est envoyé

Lorsque je rentre la bonne réponse pour le capcha mes var_dump donne ceci

array(2) { ["msg"]=> NULL ["answer"]=> string(5) "lundi" } array(6) { ["name"]=> string(3) "aqw" ["email"]=> string(10) "[email protected]" ["subject"]=> string(2) "dx" ["messager"]=> string(2) "dx" ["captcha"]=> string(5) "lundi" ["send"]=> string(8) "Envoyer " }

Lorsque je rentre la mauvaise réponse pour le capcha mes var_dump donne ceci
array(2) { ["msg"]=> string(21) "Captcha non valide..." ["answer"]=> string(5) "mardi" } array(0) { }

voici mon du formulaire

Code : Tout sélectionner

<?php // Démarrage de session session_start(); //on affiche les erreurs error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); var_dump($_SESSION); var_dump($_POST); //ou avec !EMPTY() //Si la variable $_POST['truc'] existe et n'est pas vide, alors $truc = $_POST['truc'] sinon elle vaut NULL $_SESSION['msg']= !empty($_SESSION['msg']) ? $_SESSION['msg'] : NULL; // Tableau avec les différentes questions/réponses pour notre captcha $quiz = [ 0 => [ 'question' => 'Quel est le premier jour de la semaine?', 'answer' => 'lundi' ], 1 => [ 'question' => 'Quel est le deuxième jour de la semaine?', 'answer' => 'mardi' ], 2 => [ 'question' => 'Quel est le troisième jour de la semaine?', 'answer' => 'mercredi' ], ]; // On utilise array_rand pour avoir un id aléatoire de notre tableau $id = array_rand($quiz); // On utilise l'id donné par array_rand pour pouvoir stocker la bonne réponse dans $_SESSION['reponse'] $_SESSION['answer'] = $quiz[$id]['answer']; //Var_dump ($_SESSION['answer']); //Var_dump ($_SESSION['msg']); // On stock la question dans une variable toujours via l'id donné par array_rand $question = $quiz[$id]['question']; ?> <!doctype html> <html lang="fr"> <!-- debut head --> <head> <?php include("./include/head.php"); ?> <!-- deux scripts tarteaucitron le deuxiem est celui qui devrait etres mis en dur dans chque page--> <script src="/tarteaucitron/tarteaucitron.js"></script> <script src="/js/tartecitron-peche-perle2.js"></script> <title>Formulaire de contat pour la pêche à la perle</title> <link rel="shortcut icon" href="https://phil.pecheperle.be/image/la-peche-a-la-perle.ico" type="image/x-icon"/> <meta name="description" content="Une question ,un renseignement sur la pêche a la perle du gardon?utilises le formulaire de contact "> <link rel="stylesheet" type="text/css" href="/css/banniere-menu-peche-perle.css"/> <link rel="stylesheet" type="text/css" href="/css/contact-peche-perle.css"/> </head> <!-- fin head --> <!-- debut body --> <body style="background-color:#cec1c1;" onLoad="document.getElementById('attente').style.display='none'"> <div class="container" style="background-color:#87CEEB;"> <!-- debut container entete--> <div class="container" style=" max-width: 100%;margin:auto;"> <?php include("./include/baniere-peche-perle.php"); ?> <?php include("./include/menu3.php"); ?> </div> <!-- id attende chargement page --> <div id='attente'> <p style="text-align: center;font-size: 24px;">Veuillez patienter svp la page est en cours de chargement ...</p> </div> <!-- debut body --> <body> <!-- debut container page --> <div class="container1 border border-dark" style="padding: 15px;background: #ECE9E7;"> <!-- debut formulaire--> <form id="form" enctype="multipart/form-data" action="traitement-formulaire-test.php" onsubmit="return validate()" method="post" style="background: #ECE9E7;"> <h1>Formulaire de contact</h1> <div class="form-group"> <label for="name">Nom:<span>*</span></label> <input type="text" id="name" name="name" class="form-control" placeholder="Nom" required> </div> <div class="form-group"> <label for="email">Email:<span>*</span></label> <input type="email" class="form-control" id="email" name="email" placeholder="Email"> <label for="email">Email</label> </div> <div class="form-group"> <label for="subject">Sujet:</label> <input type="text" id="subject" name="subject" class="form-control" placeholder="Demande de renseignement"> </div> <div class="form-group"> <label for="messager">Le message</label> <textarea name="messager" class="form-control" id="messager" rows="3" placeholder="Message..." required></textarea> </div> <!-- debut traitemnt captcha --> <h3>Captcha</h3> <!-- la question récupérée --> <div><?= $question ?></div> <!-- retour éventuel renvoyé par la page de traitement --> <div><?= $_SESSION['msg'] ?></div> <div> <label for="">captcha</label> <input type="text" name="captcha"> </div> <input type="submit" name="send" value="Envoyer "/> </form> </div> <div class="container" style=" max-width: 100%;margin:auto;"> <!-- debut pied de page--> <?php include("./include/pied-de-page.php"); ?> <?php include("./include/footer.php"); ?> </div> </div> </body> <!-- fin du body--> </html>
et pour le traitement

Code : Tout sélectionner

<?php <?php // Démarrage de session session_start(); //on affiche les erreurs error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); var_dump($_SESSION); var_dump($_POST); // phase du captcha // Si la reponse de l'input captcha n'est pas vide //var_dump($_POST['captcha']); if(!empty($_POST['captcha'])){ // On stock la reponse dans une variable en faisant une éventuelle conversion des majuscules en minuscule $userAnswer = strtolower($_POST['captcha']); // Si on envoi le formulaire if(isset($_POST['send'])){ //var_dump($_POST['send']); // On compare la réponse stocké dans la session avec la réponse de l'utilisateur if($_SESSION['answer'] == $userAnswer){ var_dump($_SESSION['answer']); // Ici on stock dans session le message ok, mais on peut par exemple lancer le traitement d'un message en bdd ou d'un email. $_SESSION['msg'] = 'ok'; // Si la réponse n'est pas bonne }else{ // On envoi ici un message si la réponse n'est pas identique $_SESSION['msg'] = 'Captcha non valide...'; // Qu'on soit dans le if ou le else, on renvoit l'utilisateur sur le formulaire header('Location: https://phil.pecheperle.be/testcontact.php'); } } // else pour pour le premier if, si $_POST['captcha'] est vide (à l'arrivée sur la page par exemple), on ne passe aucun message a l'utilisateur et on redirige sur index }else{ $_SESSION['msg'] = ''; header('Location: https://phil.pecheperle.be/testcontact.php'); } //on continue le reste du traitement enregistrement base de donnee +envois par mail if (!empty($_POST["send"])) { //Si les variable $_POST existent et ne sont pas vide, on récupère la valeur, sinon je mets la variable $nom à NULL $name = !empty($_POST['name']) ? $_POST['name'] : NULL; $email = !empty($_POST['email']) ? $_POST['email'] : NULL; $subject = !empty($_POST['subject']) ? $_POST['subject'] : NULL; $messager = !empty($_POST['messager']) ? $_POST['messager'] : NULL; // les variables sont pretes a etres utilisees $name = $_POST["name"]; $email = $_POST["email"]; $subject = $_POST["subject"]; $messager = $_POST["messager"]; // connexion base de donnee include ('base.php'); //préparation de la requête et des variables $sql = "INSERT INTO contact (name, email,subject, message) VALUES(?, ?, ?, ?)"; $datas = array($name,$email,$subject,$messager ); //Execution de la requete try { $requete = $bdd->prepare($sql); $requete->execute($datas); } catch(Exception $e) { // en cas d'erreur : echo " Erreur ! " . $e->getMessage(); echo " Les datas : "; print_r($datas); } //on teste pour voir si tout est ok if ($requete) { $db_msg = "Vos informations de contact sont enregistrées avec succés."; $type_db_msg = "success"; //header("location:reponses-formulaire.php");je laisse en suspend le temps des tests } else { $db_msg = "Erreur lors de la tentative d'enregistrement de contact."; $type_db_msg = "error"; } } //fin de la transmission des donnees dans la table //l'envoie du mail if (!empty($_POST["send"])) { $messager = $_POST["messager"]; $name = $_POST["name"]; $subject = $_POST["subject"]; $email = $_POST["email"]; // on entre un ou Plusieurs destinataires $to = '[email protected]'; // notez la virgule // Sujet //$subject= "une reussite"; // message $message = ' <html> <head> <title>Voici les reponses au sondage</title> </head> <body> <p>Voici le formulaire de contact</p> <tr> <td>le prenom </td><td>' . $name . '</td></br> </tr> <tr> <td>l adresse mail </td><td>' . $email . '</td></br> </tr> <tr> <td>le prenom </td><td>' . $subject . '</td></br> </tr> <tr> <td>le textera </td><td>' . $messager . '</td></br> </tr> </body> </html> '; // Pour envoyer un mail HTML, l'en-tête Content-type doit être défini $headers[] = 'MIME-Version: 1.0'; $headers[] = 'content-type: text/html; charset=utf-8'; // En-têtes additionnels //$headers[] = "From: " . $name . "<". $_POST["email"] .">\r\n"; $headers[] = 'From: ' . $email . "\r\n" . 'Reply-To: ' . $name . "\r\n" . 'X-Mailer: PHP/' . phpversion(); // Envoi //var_dump($headers); if (mail($to, $subject, $message, implode("\r\n", $headers))) { // success message //echo "Success!<br />"; } else { // error message //echo "Fail<br />"; } }

Re: impossible de faire fonctionner mon captcha de façon correcte

Posté : 30 déc. 2021, 12:39
par @rthur
Je ne sais pas si ça va résoudre ton problème mais déjà il y a un problème dans ton code :
Un appel à la fonction header("location...") pour faire une redirection doit TOUJOURS être suivi d'un appel à la fonction die() ou exit;

Car si tu demandes une redirection mais que tu continues d'envoyer du code HTML ensuite, le navigateur va décider de façon arbitraire/aléatoire soit de rediriger soit de ne pas rediriger et d'afficher le contenu HTML

Re: impossible de faire fonctionner mon captcha de façon correcte

Posté : 30 déc. 2021, 12:46
par flexi2202
Merci @rthur
oui je vais ajouter cela dans mon code en attendant j'ai trouve mon erreur
mon fichier de traitement devrait être comme celui-ci
mais lorsque l utilisateur ne remplit pas bien le captcha ses informations sont effacées du formulaire et doit tout recommencer
j avais pense a des variable les mettre en place

Code : Tout sélectionner

<?php // Démarrage de session session_start(); //on affiche les erreurs error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); var_dump($_SESSION); var_dump($_POST); // phase du captcha // Si la reponse de l'input captcha n'est pas vide //var_dump($_POST['captcha']); if(!empty($_POST['captcha'])){ // On stock la reponse dans une variable en faisant une éventuelle conversion des majuscules en minuscule $userAnswer = strtolower($_POST['captcha']); // Si on envoi le formulaire if(isset($_POST['send'])){ //var_dump($_POST['send']); // On compare la réponse stocké dans la session avec la réponse de l'utilisateur if($_SESSION['answer'] == $userAnswer){ //var_dump($_SESSION['answer']); // Ici on stock dans session le message ok, mais on peut par exemple lancer le traitement d'un message en bdd ou d'un email. //$_SESSION['msg'] = 'ok'; //on continue le reste du traitement enregistrement base de donnee +envois par mail if (!empty($_POST["send"])) { //Si les variable $_POST existent et ne sont pas vide, on récupère la valeur, sinon je mets la variable $nom à NULL $name = !empty($_POST['name']) ? $_POST['name'] : NULL; $email = !empty($_POST['email']) ? $_POST['email'] : NULL; $subject = !empty($_POST['subject']) ? $_POST['subject'] : NULL; $messager = !empty($_POST['messager']) ? $_POST['messager'] : NULL; // les variables sont pretes a etres utilisees $name = $_POST["name"]; $email = $_POST["email"]; $subject = $_POST["subject"]; $messager = $_POST["messager"]; // connexion base de donnee include ('base.php'); //préparation de la requête et des variables $sql = "INSERT INTO contact (name, email,subject, message) VALUES(?, ?, ?, ?)"; $datas = array($name,$email,$subject,$messager ); //Execution de la requete try { $requete = $bdd->prepare($sql); $requete->execute($datas); } catch(Exception $e) { // en cas d'erreur : echo " Erreur ! " . $e->getMessage(); echo " Les datas : "; print_r($datas); } //on teste pour voir si tout est ok if ($requete) { $db_msg = "Vos informations de contact sont enregistrées avec succés."; $type_db_msg = "success"; header("location:reponses-formulaire.php"); exit(); } else { $db_msg = "Erreur lors de la tentative d'enregistrement de contact."; $type_db_msg = "error"; } } //fin de la transmission des donnees dans la table //l'envoie du mail if (!empty($_POST["send"])) { $messager = $_POST["messager"]; $name = $_POST["name"]; $subject = $_POST["subject"]; $email = $_POST["email"]; // on entre un ou Plusieurs destinataires $to = '[email protected]'; // notez la virgule // Sujet //$subject= "une reussite"; // message $message = ' <html> <head> <title>Voici les reponses au sondage</title> </head> <body> <p>Voici le formulaire de contact</p> <tr> <td>le prenom </td><td>' . $name . '</td></br> </tr> <tr> <td>l adresse mail </td><td>' . $email . '</td></br> </tr> <tr> <td>le prenom </td><td>' . $subject . '</td></br> </tr> <tr> <td>le textera </td><td>' . $messager . '</td></br> </tr> </body> </html> '; // Pour envoyer un mail HTML, l'en-tête Content-type doit être défini $headers[] = 'MIME-Version: 1.0'; $headers[] = 'content-type: text/html; charset=utf-8'; // En-têtes additionnels //$headers[] = "From: " . $name . "<". $_POST["email"] .">\r\n"; $headers[] = 'From: ' . $email . "\r\n" . 'Reply-To: ' . $name . "\r\n" . 'X-Mailer: PHP/' . phpversion(); // Envoi //var_dump($headers); if (mail($to, $subject, $message, implode("\r\n", $headers))) { // success message //echo "Success!<br />"; } else { // error message //echo "Fail<br />"; } } // Si la réponse n'est pas bonne }else{ // On envoi ici un message si la réponse n'est pas identique $_SESSION['msg'] = 'Captcha non valide...'; // Qu'on soit dans le if ou le else, on renvoit l'utilisateur sur le formulaire header('Location: https://phil.pecheperle.be/testcontact.php'); exit(); } } // else pour pour le premier if, si $_POST['captcha'] est vide (à l'arrivée sur la page par exemple), on ne passe aucun message a l'utilisateur et on redirige sur index }else{ $_SESSION['msg'] = ''; header('Location: https://phil.pecheperle.be/testcontact.php'); exit(); }

Re: impossible de faire fonctionner mon captcha de façon correcte

Posté : 30 déc. 2021, 14:13
par flexi2202
j ai essaye avec ce code
mais cela ne fonctionne pas pour remplacer mes input

Code : Tout sélectionner

<input type="text" id="name" name="name" class="form-control" placeholder="Nom" required>
par ceci

Code : Tout sélectionner

<input type="text" id="name" name="name" value=" <?php if(isset($_SESSION['name'])) { //Affichage du code html si la variable $_SESSION['membre_id'] existe echo $_SESSION['name']; } //On ferme le if else {?> name<?php //Sinon affichage d'un autre code html } //On ferme le else ?>