Bonjour, Bonsoir,

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();

if(isset($_POST['captcha'])) {
   if($_POST['captcha'] == $_SESSION['captcha']) {
      echo "Captcha valide !";
   } else {
      echo "Captcha invalide...";
   }

   /* Page: index.php */
$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>

Voici mon 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:32)
Modérateur
Salut,

Tu sais c'est le même forum hein, pas besoin d'ouvrir 3 sujets en copiant collant ton problème... Ça ne nous fera pas réagir plus vite, au contraire c'est assez irritant (enfin pour ma part).



Déjà, premier post il y a 13h donc hier soir à 21h environ... on a autre chose a faire des fois le soir... comprends qu'on ne peux pas répondre dans la nuit...
Et si personne ne répond c'est que ceux qui ont lu ton sujet n'ont pas la solution, ou n'ont pas le temps de s'y pencher. Il faut t'armer de patience, continuer a creuser de ton coté, demander sur d'autre forum...

Courage, ça va venir.

Bonne journée
Modifié par _laurent (30 May 2018 - 10:10)
Modérateur
Bon déjà, pourquoi tu check le captcha
if(isset($_POST['captcha'])) {

AVANT de voir si le formulaire à été envoyé ?
if(isset($_POST['envoyer'])) {

C'est au niveau de la vérif de tes champs qu'il faudrait le faire non ?
J'ai volontairement séparer les deux pour que ça soit lisible pour les personnes qui veulent se pencher,j'ai déjà essayé ceci mais ça ne fonctionne pas :

if(isset($_POST['envoyer']) AND isset($_POST['captcha'])) {

ou bien

if(isset($_POST['envoyer']) AND $_POST['captcha'] == $_SESSION['captcha']) {

Je pense que c'est un problème de placement du

   echo "Captcha valide !";
   } else {
      echo "Captcha invalide...";
   }

Ou bien que mes champs soit tous en empty et que ce n'est pas compatible.
Voilà le raisonnement ou j'en suis
Modérateur
Mais pourquoi tu ne fais pas la vérification du ce champs comme n'importe quel autre ?

if(isset($_POST['envoyer']))
    if(empty($_POST['mail']))
        if(!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+.[a-zA-Z]{2,6}$#",$_POST['mail']))
            if(empty($_POST['sujet']))
                if(empty($_POST['message']))
                    if(isset($_POST['captcha'])) {
                        if($_POST['captcha'] == $_SESSION['captcha'])se
                                // on envoi le mail
Le problème que j'ai c'est qu'après avoir vérifier tous les champs :
if(isset($_POST['envoyer']))
    if(empty($_POST['mail']))
        if(!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+.[a-zA-Z]{2,6}$#",$_POST['mail']))
            if(empty($_POST['sujet']))
                if(empty($_POST['message']))
                    if(isset($_POST['captcha'])) {
                        if($_POST['captcha'] == $_SESSION['captcha'])se
                                // on envoi le mail

Le else étape par étape permet d'accéder à l'envoi du formulaire or ici
{
      echo "Captcha valide !";
   } else {
      echo "Captcha invalide...";
   }

ma mon else se ferme. je pense que c'est la structure ou l'algorithme est mal pensé Smiley confus En prime j'ai l'erreur 500.
Vous voulez dire ça ?
if(mail($VotreAdresseMail,utf8_encode($Sujet),nl2br($Message),$Entetes)) {
  echo "Le mail à été envoyé avec succès !";
} else {
  echo "Une erreur est survenue, le mail n'a pas été envoyé";
}

comme ceci : ?

if(mail($VotreAdresseMail,utf8_encode($Sujet),nl2br($Message),$Entetes)) {
  echo "Captcha valide !";
} else {
  echo "Captcha invalide...";
}
  echo "Le mail à été envoyé avec succès !";
} else {
  echo "Une erreur est survenue, le mail n'a pas été envoyé";
}
Modérateur
Smiley sweatdrop pas du tout........ c'est juste faire la meme verification que tu as fait sur tout tes autres champs if empty error else on envoie...

Tu l'a fais pour tout tes autres champs.... et en dernier tu as
if(empty($_POST['message'])) {
                        echo "Le champ message est vide";
                    }else{
                        //tout est correctement renseigné, on envoi le mail
}

Il faut juste faire une étape de plus avec le captcha !!

Comme ça quoi :
$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{
                    if(isset($_POST['captcha'])) {
                        if($_POST['captcha'] == $_SESSION['captcha']) {
                            echo "Captcha valide !";
                            
                                //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é";
                                }
                        }
                    } else {
                        echo "Captcha invalide...";
                    }
                }
            }
        }
    }
}
Meilleure solution
Alors j'ai testé pour tous les champs et ça fonctionne MERCI ! En revanche le else concernant le captcha invalide n'apparait pas ou lorsque je saisi volontairement une erreur:

else {
    echo "Captcha invalide...";
}

Modifié par LOIC_75 (30 May 2018 - 11:27)
Modérateur
LOIC_75 a écrit :
le else concernant le captcha invalide n'apparait pas ou lorsque je saisi volontairement une erreur

Tu veux dire que ça ne te dit qu'il y a une erreur que quand il y a une erreur ?
Tu veux que ça marque qu'il y a une erreur même quand il n'y en a pas ? Smiley biggol
Modifié par _laurent (30 May 2018 - 11:36)
J'ai refait encore des tests et en faite il y avait une accolade de trop et.....ça fonctionne !!!
Youpi ! Smiley cligne Merci Laurent !
Modifié par LOIC_75 (30 May 2018 - 11:41)
Ouh, Ouh, html5 est sorti Smiley biggrin
<form method="post" action="index.php">
	Mail: <input type="email" name="mail" value="" />
        Sujet: <input type="text" name="sujet" value="" required />
    Message: <textarea name="message" cols="40" rows="20"></textarea>
    <img src="captcha.php" />
   <input type="text" name="captcha" required />
   <input type="submit"  value="Envoyer"/>
</form>

Il ne reste à rien de mettre un name à <input type="submit" />. Sa valeur ne change jamais.
Et dans l'analyse de $_POST cela n'a aucun intérêt. Vous n'envoyez pas sa valeur par mail !

Et input_filter en PHP, c'est bien. Mangez-en !
<?php
const VOTRE_ADRESSE_MAIL = "test@gmail.com"; //mettez ici votre adresse mail

//on vérifie que le champ mail est correctement rempli
$mail = filter_input(INPUT_POST, 'mail', FILTER_VALIDATE_EMAIL);
if($mail === false) {
	echo "Mail invalide";
} else {
	$sujet = filter_input(INPUT_POST, 'sujet', FILTER_SANITIZE_STRING);
	if(empty(trim($sujet))) {
		echo "Le sujet n'est pas renseigné";
	} else {
		$message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING);
		if(empty(trim($message))) {
			echo "Désolé, nous n'avons pas compris votre message";
		} else {
			$captcha = filter_input(INPUT_POST, 'captcha', FILTER_SANITIZE_STRING);
			if(empty($captcha) or $captcha !== $_SESSION['captcha']) {
				echo "Captcha incorrect";
			} else {
				// Super, on a filtré tout ce qu'on a reçu
				$headers = array(
					/* *
					 * 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
					 * */
					"From: Nom de votre site $mail",
					"Reply-To: Nom de votre site $mail",
					'MIME-Version: 1.0',
					'Content-type: text/html; charset=utf-8'
				);
				if(mail(
					VOTRE_ADRESSE_MAIL,
					$sujet,
					nl2br($message),
					implode("\r\n", $headers)
				)) {
					echo "Fantastique! Nous avons réussi à envoyer votre mail";
				} else {
					echo "Désolé, votre mail s'est coincé quelque part";
				}
			}
		}
	}
}
?>
basooka, merci ,je suis d'accord mais le htmlentities() ou htmlspecialcharts() c'est un oubli ? ou le filter_input() s'occupe de tout ?
Pour les mails : FILTER_VALIDATE_EMAIL
Vérifie que l'émail est correctement formulé. Donc si c'est vide, c'est pas bon
http://php.net/manual/fr/filter.filters.validate.php
retourne false en cas d'échec

Pour les autres entrées textuelles : http://php.net/manual/fr/filter.filters.sanitize.php
On nettoie la chaîne de caractères en virant les balises et en encodant les caractères spéciaux
http://php.net/manual/fr/filter.filters.sanitize.php

Doc générale sur le filtrage des données
http://php.net/manual/fr/book.filter.php

Autre fonction intéressante : filter_has_var(INPUT_POST, 'mon-truc-plumes'] au lieu de isset($_POST['mon-truc-en-plumes'])
http://php.net/manual/fr/function.filter-has-var.php

htmlentities et compagnie sont moins puissantes car elles n'enlèvent pas les balises <?php ?> par exemple ou <a href="#">clique-moi</a>

Même si j'ai une bonne maîtrise des regex, je me garderai bien de formuler un masque pour vérifier un email valide tellement les possibilités sont nombreuses.