Bonjour,
Rien n'est trop beau pour les visiteurs de mon site.
C'est ainsi que pour renforcer la sécurité, j'ai pensé ajouter un captcha de chez Google lors de la demande d'un renouvellement de mot de passe.
Cependant l'intégration de ce captcha au script chargé de la demande de renouvellement de mot de passe me semble plus difficile à mettre en place que prévu.
C'est ainsi que j'ai pensé vous demander de l'aide afin de pouvoir parvenir à cette fusion des deux fichiers.
Voici donc le fichier recuperation.php pour la récupération d'un mot de passe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?php
session_start();
require_once('connexion.php');
 
if(isset($_GET['section'])) {
$section = htmlspecialchars($_GET['section']);
} else {
$section = "";
}
 
if(isset($_POST['recup_submit'],$_POST['recup_mail'])) {//Si un e-mail est présent et que "valider" est appuyé on passe ligne suivante.
   if(!empty($_POST['recup_mail'])) {//Si ($_POST['recup_mail']) présent et pas vide on passe ligne suivante.
      $recup_mail = htmlspecialchars($_POST['recup_mail']);
      if(filter_var($recup_mail,FILTER_VALIDATE_EMAIL)) {
         $mailexist = $connection->prepare('SELECT id, username FROM inscriptions WHERE mail = ?');
         $mailexist->execute(array($recup_mail));//$recup_mail est le mail inscrit dans le formulaire (<input type="email") et qui doit se trouver en table inscription.
         $mailexist_count = $mailexist->rowCount();//On compte les lignes correspondant à l'e-mail (1 ou 0 ligne).
         if($mailexist_count == 1) {
            $pseudo = $mailexist->fetch(); 
			$pseudo = $pseudo['username'];// $pseudo est le membre demandant sont mot de passe.
			//var_dump ($pseudo);	//Fonction qui permet d'analyser une variable.
            $_SESSION['recup_mail'] = $recup_mail; //L'e-mail est mis en session pour la demande du code.
            $recup_code = "";
            for($i=0; $i < 8; $i++) { 
               $recup_code .= mt_rand(0,9); //Le point permet d'écrire les chiffres les uns à la suite des autres.
            }
			//var_dump ($recup_code); //Fonction qui permet d'analyser une variable.
            $mail_recup_exist = $connection->prepare('SELECT id FROM recuperation WHERE mail = ?');//Pour vérifier si l'e-mail exite dans la table.
            $mail_recup_exist->execute(array($recup_mail));
            $mail_recup_exist = $mail_recup_exist->rowCount();
            if($mail_recup_exist == 1) {//Si $mail_recup_exist cette variable est égale à 1. On passe alors à la ligne suivante.
               $recup_insert = $connection->prepare('UPDATE recuperation SET code = ? WHERE mail = ?');//Si l'e-mail existe déjà => on  met à jour le code.
               $recup_insert->execute(array($recup_code,$recup_mail));
            } else {//Sinon on insère dans la table recuperation l'e-mail, le code de confirmation et 0 ligne suivante.
               $recup_insert = $connection->prepare('INSERT INTO recuperation(mail,code,confirme) VALUES (?, ?, "0")');
               $recup_insert->execute(array($recup_mail,$recup_code));
            }
############  Envoi de l'e-mail  ################################################################################################           
            $son_objet="Objet à psftxa";
            $son_email=$recup_mail;
 
            //Variable à compléter
            $mon_pseudo="Admin";
            $mon_email="postmaster@jeuxechecs.fr";
            $msg_pour_moi="Un membre a demandé un nouveau mot de passe";
            $son_objet="Envoi du code d'identification de mot de passe.";
            $mon_objet="Demande d'envoi d'un code d'identification de mot de passe.";
 
            //Mise en forme de l'accusé de réception que la personne recevra.
		$accuse_pour_lui = "Bonjour $pseudo,\n
    	Nous avons reçu une demande de récupération de votre mot de passe envoyée avec votre adresse e-mail $recup_mail.\n
    	- Votre code de vérification pour le Q-C-M est : $recup_code\n
    	- Ceci est un email automatique, merci de ne pas y répondre.  \n
    	Cordialement";
 
         //Envoie du mail que recevra la personne qui souhaite un renouvellement de mot de passe.
		//On prépare l'entête du message
		$header="MIME-Version: 1.0\r\n";
		$entete = "From: " . $mon_pseudo . " <" . $mon_email . ">\n";
		$entete.='Content-Type:text/plain; charset="utf-8"'."\n";
		$entete .='Content-Transfer-Encoding: 8bit';
		//$entete.='Content-Type:text/html; charset="utf-8"'."\n";
 
		//Si le mail a été envoyé
		if (@mail($mon_email,$mon_objet,$msg_pour_moi,$entete) && @mail($son_email,$son_objet,$accuse_pour_lui,$entete)){
 
			//On affiche un message de confirmation
			$error= "<h3 style=\"text-align:center\">Votre message a été envoyé, vous recevrez une confirmation par mail.><br /><br />\n"; 
			//Avec un lien de retour vers l'accueil du site
			$error= "<a href=\"" . $mon_url . "\">Retour au login</a></h3>\n"; 
		}
		//Sinon il y a eu une erreur lors de l'envoi
		else { 
			$error= "<p style=\"text-align:center\">Un problème s'est produit lors de l'envoi du message.\n";
			//On propose un lien de retour vers le formulaire
			$error= "<a href=\"".$_SERVER["PHP_SELF"]."\">Réessayez...</a></p>\n"; 
		}        
         //mail($recup_mail, "Récupération de mot de passe - PANZER!!", $message, $header);
            header('Location:../motdepasse/recuperation.php?section=code');
            exit ();
         } else {
            $error = "Cette adresse mail n'est pas enregistrée";
         }
      } else {
         $error = "Adresse mail invalide";
      }
   } else {
      $error = "Veuillez entrer votre adresse mail";
   }
}
//Le formumaire pour entrer le code s'affiche.
if(isset($_POST['verif_submit'],$_POST['verif_code'])) {//Si un le code reçu par e-mail est présent et que "valider" est appuyé on passe ligne suivante.
   if(!empty($_POST['verif_code'])) {//Si ($_POST['verif_code']) présent et pas vide on passe ligne suivante.
      $verif_code = htmlspecialchars($_POST['verif_code']);
      $verif_req = $connection->prepare('SELECT id FROM recuperation WHERE mail = ? AND code = ?');
      $verif_req->execute(array($_SESSION['recup_mail'],$verif_code));
      $verif_req = $verif_req->rowCount();
      if($verif_req == 1) { //Si le code inscrit provenant de l'e-mail est identique à celui du champ code de la table recuperation.
         $up_req = $connection->prepare('UPDATE recuperation SET confirme = 1 WHERE mail = ?');//Mise à jour par 1 dans le champ confirme en correspondance avec l'e-mail.
         $up_req->execute(array($_SESSION['recup_mail']));
         header('Location:../motdepasse/recuperation.php?section=changemdp');
		 exit ();
      } else {
         $error = "Code invalide";
      }
   } else {
      $error = "Veuillez entrer votre code de confirmation";
   }
}
if(isset($_POST['change_submit'])) { //Pour changer le mot de passe.
   if(isset($_POST['change_mdp'],$_POST['change_mdpc'])) {//Si les mots de passe sont inscrits.
      $verif_confirme = $connection->prepare('SELECT confirme FROM recuperation WHERE mail = ?');//Sélectionne la champ confirme à partir de l'e-mail.
      $verif_confirme->execute(array($_SESSION['recup_mail']));
      $verif_confirme = $verif_confirme->fetch();
      $verif_confirme = $verif_confirme['confirme'];
      if($verif_confirme == 1) { //Si dans le champ confirme la valeur est égale à 1, on passe à la ligne suivante.
         $mdp = htmlspecialchars($_POST['change_mdp']);
         $mdpc = htmlspecialchars($_POST['change_mdpc']);
         if(!empty($mdp) AND !empty($mdpc)) { //Si $mdp et $mdpc sont présents et ne sont pas vides, on passe à la ligne suivante.
            if($mdp == $mdpc) {
               $mdp = hash('sha256',$mdp);
               $ins_mdp = $connection->prepare('UPDATE inscriptions SET Password = ?  WHERE mail = ?');//On met à jour le mot de passe en correspondance avec l'e-mail.
               $ins_mdp->execute(array($mdpx, $_SESSION['recup_mail']));
              $del_req = $connection->prepare('DELETE FROM recuperation WHERE mail = ?');//On supprime la ligne en correspondance avec l'email dans la table recuperation.
              $del_req->execute(array($_SESSION['recup_mail']));
               header('Location:../_qcm/ph_qcm/index.php'); //Redirection vers la page d'accueil du Q-C-M.		   			   
            } else {
               $error = "Vos mots de passes ne correspondent pas";
            }
         } else {
            $error = "Veuillez remplir tous les champs";
         }
      } else {
         $error = "Veuillez valider votre mail grâce au code de vérification qui vous a été envoyé par mail";
      }
   } else {
      $error = "Veuillez remplir tous les champs";
   }
}
?>
<!-- Formulaires-->
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Récupération de votre mot de passe</title>
<link href="../css/formulaire.css" rel="stylesheet" type="text/css" />
</head>
 
<body>
<h4 class="title-element">Récupération de mot de passe</h4>
<?php if($section == 'code') { ?>
Un code de vérification vous a été envoyé par mail à: <?= $_SESSION['recup_mail'] ?>
<br/><br/>
<form method="post">
   <input type="text" placeholder="Code de vérification" name="verif_code"/><br/><br/>
   <input type="submit" value="Valider" name="verif_submit"/>
</form>
<?php } elseif($section == "changemdp") { ?>
Nouveau mot de passe pour <?= $_SESSION['recup_mail'] ?>
<form method="post">
   <input type="password" placeholder="Nouveau mot de passe" name="change_mdp"/><br/><br/>
   <input type="password" placeholder="Confirmation du mot de passe" name="change_mdpc"/><br/><br/>
   <input type="submit" value="Valider" name="change_submit"/>
</form>
<?php } else { ?>
<form method="post">
   <input type="email" placeholder="Votre adresse mail" name="recup_mail"/><br/><br/>
   <input type="submit" value="Valider" name="recup_submit"/>
</form>
<?php } ?>
<?php if(isset($error)) { echo '<span style="color:red">'.$error.'</span>'; } else { echo ""; } ?>
</body>
</html>
Et le script concernant le captcha:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
//https://fr.jeffprod.com/blog/2014/installez-le-nouveau-captcha-de-google-sur-votre-site-en-php/
require 'recaptchalib.php';
$siteKey = 'XXXXXXXXXXXXXXXXXX'; // votre clé publique
$secret = 'YYYYYYYYYYYYYYYYYY'; // votre clé privée
?>
<html>
 <head>
  <title>Ma page</title>
  <script src="https://www.google.com/recaptcha/api.js"></script>
 </head>
 <body>
<?php
$reCaptcha = new ReCaptcha($secret);
if(isset($_POST["g-recaptcha-response"])) {
    $resp = $reCaptcha->verifyResponse(
        $_SERVER["REMOTE_ADDR"],
        $_POST["g-recaptcha-response"]
        );
    if ($resp != null && $resp->success) {echo "OK";}
    else {echo "CAPTCHA incorrect";}
    }
?>     
  <form action="test-captcha.php" method="POST">
   <div class="g-recaptcha" data-sitekey="<?php echo $siteKey; ?>"></div>
   <input type="submit" value="Envoyer">
  </form>
 </body>
</html>
Enfin, voici en images le déroulement de la demande de mot de passe:
Nom : screenshot_05.jpg
Affichages : 498
Taille : 13,0 Ko

Puis l'insertion d'un code reçu par e-mail:
Nom : screenshot_05.jpg
Affichages : 551
Taille : 17,6 Ko

Puis l'insertion du nouveau mot de passe:
Nom : screenshot_07.jpg
Affichages : 539
Taille : 16,6 Ko

Et voici le captcha à intégrer si possible:
Nom : screenshot_06.jpg
Affichages : 491
Taille : 13,2 Ko

Après le clic sur check box
Nom : screenshot_08.jpg
Affichages : 524
Taille : 13,5 Ko

Ensuite après le clic sur Envoyer:
Nom : screenshot_09.jpg
Affichages : 493
Taille : 13,6 Ko

Merci d'avance de bien vouloir m'aider à ajouter ce captach pour la sécurité de mes visiteurs.