8768 sujets

Développement web côté serveur, CMS

Bonjour, je dois faire un captcha pour mon Porte Folio dans mon formulaire de contact, je suis donc allez voir sur open classroom un tuto jusque là tout va bien.
j'ai un fichier capchat.php où il y les fonctions et un fichier de contactMail.php.
Pour vérifier que le $_POST de mon formulaire est correct avec le $_SESSION de ma fonction de faire une condition mais le problème c'est que même si c'est bon il me met "Le captcha n'est pas bon." j'ai pourtant vérifier et je ne vois pas l'erreurs.


ma Fonction
 
<?php



function motListe()
{
	$liste = file('dico.text');
	return trim($liste[array_rand($liste)]);
}

function motHasard($n)
{
	// Séquence aléatoire
	return substr(md5(uniqid()),0,$n);
}

function captcha()
{
	$mot = motHasard(6);	
	//session_start (); 
	$_SESSION['captcha'] = $mot;

	return $mot;
}
?>


mon code de formulaire

<?php
	session_start();
	require ('capchat.php') ;
?>
<?php
if(isset($_POST['mailform'])){

	if(!empty($_POST['nom']) && !empty($_POST['mail']) && !empty($_POST['message']) && !empty($_POST['captcha']) ){//Si c'est pas vide 
	//session_start();
		if($_POST['captcha'] == $_SESSION['captcha'] ) {
			
			$msg = 'Le captcha est bon, votre nom est '.$_POST['nom'];
			$header="MIME-Version: 1.0\r\n";
			$header.='From:'.$_POST['nom'].'<'.$_POST['mail'].'>'."\n";
			$header.='Content-Type:text/html; charset="uft-8"'."\n";
			$header.='Content-Transfer-Encoding: 8bit';

			$message='
			<html>
				<body>
					<div align="center"> 
						
						<br />
						<u>Nom de l\'expéditeur :</u>'.$_POST['nom'].'<br />
						<u>Mail de l\'expéditeur :</u>'.$_POST['mail'].'<br />
						<br />
						'.nl2br($_POST['message']).'
						<br />
						
					</div>
				</body>
			</html>
			';

			mail("contact@***", "CONTACT - camille-davidp15.fr", $message, $header);
			$msg="Votre message a bien été envoyé !";
		}
		else{
			$msg = 'Le captcha n\'est pas bon.';
		}
	}
	else{
		$msg="Tous les champs doivent être complétés !";
	}
}
?>
<html>
<head>
	<meta charset="utf-8" />
	<link href="SourceMenuHeader.css" media="all" rel="stylesheet"  type="text/css" />
	<meta name="viewport" content="width=device-width"/>
	<title>Contact</title>
	<style>

		#imgAccueil {
			width: 50px;
			height:50px;
			
		}
		.titrePage{
			text-align: center;
		  font-family: 'Lobster Two', regular;
			font-size: 70px;
		}

		.zoneTexte {
			position: absolute;
			margin-top: 350px;
			margin-left: 240px;
			background-color: #F9EBEA ;
			width: 1092px;
			height: 560px;
			opacity: 0.9;
			border-radius: 20px;
		}


		p#intro{
			text-indent: 3em;
			padding-left: 30px;
		} 
		
		p#PDP {
			margin-top: 33px;
			
		}

		.FormContact {
			margin-left: 350px;
			width: 450px;
		}
	
	</style>
</head>
<body>
	
	<?php
	include('menuHeader.php');
	?>
	
	<div class="zoneTexte">
		<a href="Index.html"><img id="imgAccueil" src="../Images/Icones/iconeHome.png" alt="Retour Accueil"/></a>
		<H1 class="titrePage">Contacter le webmaster</H1>
		
		<p id="intro">
		
		<form method="POST" action="" class="FormContact">
		<fieldset>
		<legend>Contact</legend>
			Votre Nom: <input type="text" name="nom" placeholder="Votre nom" value="<?php if(isset($_POST['nom'])) { echo $_POST['nom']; } ?>" />
			<br/><br/><!--Pour les value si elle existe on garde -->
			Votre Mail : <input type="email" name="mail" placeholder="Votre email" value="<?php if(isset($_POST['mail'])) { echo $_POST['mail']; } ?>" />
			<br/><br/>
			Votre Message<textarea name="message" placeholder="Votre message"><?php if(isset($_POST['message'])) { echo $_POST['message']; } ?></textarea>
			<br/><br/>
			<label for="captcha">Recopiez le mot : "<?php echo captcha(); ?>"</label>
			<input type="text" name="captcha" id="captcha" /><br />
			
			<input type="submit" value="Envoyer !" name="mailform"/>
		</fieldset>
		</form>
		<?php
			if(isset($msg))//Si elle existe 
			{
				echo $msg;
			}
		?>
		
		
		</p>
		
		<p id="PDP">
		 ©  Copyright tout droit reservé 2017 - /// 
		</p>
	</div>
	

</body>
</html>


est ce que quelqu’un a une idée du problème ?
Modifié par Rodolphe (22 Feb 2020 - 18:54)
Modérateur
Hello,

Avant de faire ta condition :

....
if($_POST['captcha'] == $_SESSION['captcha']){
....


as tu débogué ?

....
var_dump($_POST['captcha']);
var_dump($_SESSION['captcha']);
var_dump($_POST['captcha'] == $_SESSION['captcha']);
die();
if($_POST['captcha'] == $_SESSION['captcha']){
......


Au passage, l'envoi d'un mail n'est jamais sûr à 100% Smiley cligne


* lu le code en Z
Avec le script que tu as rajouter cela m'affiche" string(6) "6bf07a" NULL bool(false)"
Modifié par NenoLucia (17 Sep 2017 - 15:57)
Modérateur
Est ce que tu as compris ce que j'ai écrit ?

Selon toi,
- que vaut $_SESSION['captcha'] ?
- Pourquoi ($_POST['captcha'] == $_SESSION['captcha']) vaut false ?
RE

Pour moi $_SESSION['captcha'] vaut le $mot où il y a le mot a recopier
et si la saisie est pareil pour le mot hasard ça devrai être bon.

Le $mot s'affiche dans le formulaire, je pense que c'est peut être a cause du md5 dans la fonction que je demande de comparer avec le $_POST[''] sans l'avoir crypté.
Modérateur
NenoLucia a écrit :
RE

Pour moi $_SESSION['captcha'] vaut le $mot où il y a le mot a recopier
et si la saisie est pareil pour le mot hasard ça devrai être bon.

Le $mot s'affiche dans le formulaire, je pense que c'est peut être a cause du md5 dans la fonction que je demande de comparer avec le $_POST[''] sans l'avoir crypté.


En fait ça ne vient pas de là puisque le captcha s'affiche et c'est lui qui est encodé en md5. L'utilisateur ne fait que recopier le résultat du md5...

Ton problème vient du fait que la déclaration session_start() est fait n'importe comment (entres autres). J'ai corrigé ton code à de nombreux endroits. Normalement, ça devrait fonctionner maintenant.

J'ai gardé la logique de ton code qui est mal ficelé à de nombreux endroits. En effet, ton captcha permet de filtrer. Mais en fait, si l'on veut réellement, on le casse sans problème. Entres autres, je pense que tu devrais te créer un système d'opération ou mettre en place un honey pot.... Il y a également un captcha en JS. Mais cela implique que le Javascript sera obstructif....


<?php
    session_start();
    $_SESSION['captcha'] = !isset($_POST['mailform']) ? substr(md5(uniqid()),0,6) : $_SESSION['captcha'];

    if(isset($_POST['mailform']) && $_POST['mailform'] === "Envoyer !"){    
        if(!empty($_POST['nom']) && !empty($_POST['mail']) && !empty($_POST['message']) && !empty($_POST['captcha']) ){
            if($_POST['captcha'] == $_SESSION['captcha'] ) {
                $header="MIME-Version: 1.0\r\n";
                $header.='From:'.$_POST['nom'].'<'.$_POST['mail'].'>'."\n";
                $header.='Content-Type:text/html; charset="uft-8"'."\n";
                $header.='Content-Transfer-Encoding: 8bit';

                $message='
                <html>
                    <body>
                        <div align="center"> 
                            
                            <br />
                            <u>Nom de l\'expéditeur :</u>'.$_POST['nom'].'<br />
                            <u>Mail de l\'expéditeur :</u>'.$_POST['mail'].'<br />
                            <br />
                            '.nl2br($_POST['message']).'
                            <br />
                            
                        </div>
                    </body>
                </html>
                ';
                $msg = mail("contact@***", "CONTACT - camille-davidp15.fr", $message, $header) ? "Votre message a bien été envoyé !" : "Votre message n'a pas été bien envoyé !";
            }else{
                $msg = "Le captcha n'est pas bon.";
            }
        }else{
            $msg="Tous les champs doivent être complétés !";
            $_SESSION['captcha'] = substr(md5(uniqid()),0,6);
        }
    }
?>
<html>
<head>
    <meta charset="utf-8" />
    <link href="SourceMenuHeader.css" media="all" rel="stylesheet"  type="text/css" />
    <meta name="viewport" content="width=device-width"/>
    <title>Contact</title>
    <style>

        #imgAccueil {
            width: 50px;
            height:50px;
            
        }
        .titrePage{
            text-align: center;
          font-family: 'Lobster Two', regular;
            font-size: 70px;
        }

        .zoneTexte {
            position: absolute;
            margin-top: 350px;
            margin-left: 240px;
            background-color: #F9EBEA ;
            width: 1092px;
            height: 560px;
            opacity: 0.9;
            border-radius: 20px;
        }


        p#intro{
            text-indent: 3em;
            padding-left: 30px;
        } 
        
        p#PDP {
            margin-top: 33px;
            
        }

        .FormContact {
            margin-left: 350px;
            width: 450px;
        }
    
    </style>
</head>
<body>
    
    <?php
    include('menuHeader.php');
    ?>
    
    <div class="zoneTexte">
        <a href="Index.html"><img id="imgAccueil" src="../Images/Icones/iconeHome.png" alt="Retour Accueil"/></a>
        <h1 class="titrePage">Contacter le webmaster</h1>
        
        <div id="intro">
        
        <form method="POST" action="" class="FormContact">
        <fieldset>
        <legend>Contact</legend>
            Votre Nom: <input type="text" name="nom" placeholder="Votre nom" value="<?php if(isset($_POST['nom'])) { echo $_POST['nom']; } ?>" />
            <br/><br/><!--Pour les value si elle existe on garde -->
            Votre Mail : <input type="email" name="mail" placeholder="Votre email" value="<?php if(isset($_POST['mail'])) { echo $_POST['mail']; } ?>" />
            <br/><br/>
            Votre Message<textarea name="message" placeholder="Votre message"><?php if(isset($_POST['message'])) { echo $_POST['message']; } ?></textarea>
            <br/><br/>
            <label for="captcha">Recopiez le mot : "<?php echo $_SESSION['captcha'] ?>"</label>
            <input type="text" name="captcha" id="captcha" /><br />
            
            <input type="submit" value="Envoyer !" name="mailform" />
        </fieldset>
        </form>
        <?php
            if(isset($msg)){
                echo $msg;
            }
        ?>
        </div>
        
        <p id="PDP">
         ©  Copyright tout droit reservé 2017 - /// 
        </p>
    </div>
</body>
</html>

Modifié par Rodolphe (22 Feb 2020 - 18:55)
Meilleure solution
Re excusez moi pour le délais, j'ai refais et cela me met toujours comme quoi le capchat n'est pas le bon après c'est pour un projet pour les profs je peux aussi faire un truc du genre " Combien font 2 + 2" pour juste anti robot je pense
Salut,

Pour moi le code de Niuxe fonctionne très bien. j'ai juste tester avec wampserver et j'ai pas de problème.
Modérateur
De rien Smiley smile

NenoLucia a écrit :
je peux aussi faire un truc du genre " Combien font 2 + 2" pour juste anti robot je pense


+1

et si le l'opérateur est en image, c'est nettement plus efficace. Cependant, tu perds en accessibilité.
Administrateur
Bonjour,

les non-voyants sont dans l'impossibilité de passer cet obstacle dressé devant eux ; les malvoyants c'est à peu près pareil et je sais pas vous mais moi je commence à avoir du mal avec les "cliquez sur toutes les images qui contiennent un kiwi ou un panneau de signalisation routière" (mais je n'en remplis pas souvent).

Si on est pas un profil à très haut risque comme Google, Facebook, etc quelques pistes alternatives et pourquoi de toute façon...
CAPTCHA-less Security
List of Resources: Breaking CAPTCHA Smiley gol2
Et - parmi les bonnes ressources du RGAA 3 - ce que le Guide de l'intégrateur a à en dire (voir aussi dans le référentiel technique les critères 1.4 et 1.5)
Modifié par Felipe (22 Sep 2017 - 16:58)
Modérateur
Felipe a écrit :
je sais pas vous mais moi je commence à avoir du mal avec les "cliquez sur toutes les images qui contiennent un kiwi ou un panneau de signalissation routière" (mais je n'en remplis pas souvent).
[...]..
CAPTCHA-less Security

Amen.
Perso j'utilise la technique du "honeypot" (enfin une variante) depuis longtemps et ça marche plutôt bien. J'ai vraiment du mal avec les CAPTCHA quels qu'ils soient...
Modérateur
_laurent a écrit :

Amen.
Perso j'utilise la technique du "honeypot" (enfin une variante) depuis longtemps et ça marche plutôt bien. J'ai vraiment du mal avec les CAPTCHA quels qu'ils soient...


Idem, le honey pot est assez efficace (je l'avais mentionné dans mes précédentes réponses de ce sujet). Ensuite, on peut le cumuler avec autres choses :
- vérification (front et back) de l'intégrité des données entrantes....
- Quand on affiche le formulaire, on récupère le timestamp, ensuite on compare....
- mise en place d'un token.....
- Le formulaire ne peut pas être soumis dès son affichage (nécessite le JS).....
- injection dynamique de champs obligatoire (nécessite le JS) .....
- et enfin le honey pot......

@felipe : un gros +1
Ah oui pas mal la confirmation du submit Smiley smile
Modifié par niuxe (22 Sep 2017 - 15:02)
Modérateur
niuxe a écrit :
- Le formulaire ne peut pas être soumis dès son affichage (nécessite le JS).....
- injection dynamique de champs obligatoire (nécessite le JS) .....

Voila c'est ça que j'utilise (que j'appelais variante du honeypot) Smiley smile un champs caché rempli en Js.
Et du coup un formulaire en AJAX (ça joue ca aussi ? Vu que c'est de l'AJAX il ne peut pas etre envoyé ?).
Modérateur
_laurent a écrit :

Voila c'est ça que j'utilise (que j'appelais variante du honeypot) Smiley smile un champs caché rempli en Js.
Et du coup un formulaire en AJAX (ça joue ca aussi ? Vu que c'est de l'AJAX il ne peut pas etre envoyé ?).


niuxe a écrit :

- Le formulaire ne peut pas être soumis dès son affichage (nécessite le JS).....
- Quand on affiche le formulaire, on récupère le timestamp, ensuite on compare....

Modifié par niuxe (22 Sep 2017 - 15:32)