8722 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un petit soucis qui à l'air bête mais je n'arrive pas à faire fonctionner mon captcha avec le formulaire. je m'explique : je peux très bien envoyer un message sans passer par le captcha !. Surement une erreur de placement ? je vois vraiment pas, que dois-je faire ?

Voici mon code index.php :
<?php
session_start();
 
 /* captcha */
if(isset($_POST['captcha'])) {
   if($_POST['captcha'] == $_SESSION['captcha']) {
      echo "Captcha valide !";
   } else {
      echo "Captcha invalide...";
   }
 
   /* formulaire */
$VotreAdresseMail="test@gmail.com";//mettez ici votre adresse mail
if(isset($_POST['envoyer'])) { // si le bouton "Envoyer" est appuyé
    //on vérifie que le champ mail est correctement rempli
    if(empty($_POST['mail'])) {
        echo "Le champ mail est vide";
    } else {
        //on vérifie que l'adresse est correcte
        if(!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+.[a-zA-Z]{2,6}$#",$_POST['mail'])){
            echo "L'adresse mail entrée est incorrecte";
        }else{
            //on vérifie que le champ sujet est correctement rempli
            if(empty($_POST['sujet'])) {
                echo "Le champ sujet est vide";
            }else{
                //on vérifie que le champ sujet est correctement rempli
                if(empty($_POST['message'])) {
                    echo "Le champ message est vide";
                }else{
                    //tout est correctement renseigné, on envoi le mail
                    //on renseigne les entêtes de la fonction mail de PHP
                    $Entetes = "MIME-Version: 1.0\r\n";
                    $Entetes .= "Content-type: text/html; charset=iso-8859-1\r\n";
                    $Entetes .= "From: Nom de votre site <".$_POST['mail'].">\r\n";//de préférence une adresse avec le même domaine de là où, vous utilisez ce code, cela permet un envoie quasi certain jusqu'au destinataire
                    $Entetes .= "Reply-To: Nom de votre site <".$_POST['mail'].">\r\n";
                    //on sécurise les champs
                    $Mail=htmlentities($_POST['mail'],ENT_QUOTES,"ISO-8859-1"); //ENT_QUOTES Convertit les guillemets doubles et les guillemets simples, en entitès HTML, ISO-8859-1 est la norme pour les langues occidentales
                    $Sujet=htmlentities($_POST['sujet'],ENT_QUOTES,"ISO-8859-1");
                    $Message=htmlentities($_POST['message'],ENT_QUOTES,"ISO-8859-1");
                    //en fin, on envoi le mail
                    if(mail($VotreAdresseMail,utf8_encode($Sujet),nl2br($Message),$Entetes)) { //la fonction nl2br permet de conserver les sauts de ligne et la fonction urf8_encore de conserver les accents dans le titre
                        echo "Le mail à été envoyé avec succès !";
                    } else {
                        echo "Une erreur est survenue, le mail n'a pas été envoyé";
                    }
                }
            }
        }
    }
}
 
}
 
?>
<form method="POST" action="index.php">
    Mail: <input type="text" name="mail" value="" />
      
    Sujet: <input type="text" name="sujet" value="" />
      
    Message: <textarea name="message" cols="40" rows="20"></textarea>
 
    <img src="captcha.php" />
   <input type="text" name="captcha" />
   <input type="submit" name="envoyer" value="Envoyer"/>
      
    <!-- <input type="submit" name="envoyer" value="Envoyer" /> -->
 
</form>


code captcha.php
<?php
session_start();
 
$_SESSION['captcha'] = mt_rand(1000,9999);
$img = imagecreate(65,30);
$font = 'fonts/@El&Font Destroy!.ttf';
 
 
$bg = imagecolorallocate($img,255,255,255);
$textcolor = imagecolorallocate($img, 0, 0, 0);
 
imagettftext($img, 23, 0, 3, 30, $textcolor, $font, $_SESSION['captcha']);
 
header('Content-type:image/jpeg');
imagejpeg($img);
imagedestroy($img);
 
?>

Modifié par LOIC_75 (30 May 2018 - 09:31)
J'ai vraiment du mal à lire ton code avec cette indentation, d'autant plus que je suis sur téléphone. Mais à la volée, je ne crois pas voir de test à proprement parlé qui nécessite un captcha dans ton code.

Il le vérifie au début, et lance tel ou tel message (echo) s'il est valide ou non, mais son résultat n'influe pas sur la validation d'envoi du mail en fin de code.

Cela semble même pareil pour tout les autres champs d'ailleurs (email, sujet) hormis le champ de message.

Tu devrais faire sortir des booléens à la fin de chacun de ces essais. Sous tes "echo", passer une variable à true si la condition est vérifié, sinon à false.

On reteste toutes ces variables à la fin avant l'envoi, et donc si tout est à true (tout les champs remplis, bon captcha) on aboutit à l'envoi du mail. Smiley cligne
Modifié par Nolan (31 May 2018 - 08:51)