IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Insertion d'un captcha pour demande de mot de passe perdu.


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Novembre 2013
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 99
    Points : 51
    Points
    51
    Par défaut Insertion d'un captcha pour demande de mot de passe perdu.
    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 : 437
Taille : 13,0 Ko

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

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

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

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

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

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

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Bonjour,

    Quel est le problème exactement ?
    Le captcha ne s'affiche-t-il pas ou est-il tout le temps invalide ?

    Je ne sais pas quelle librairie tu utilises pour faire l'appel de vérification du captcha mais vérifie peut-être la doc.
    La lib officielle de Google dit que le premier paramètre de la méthode verify() est ton $_POST['g-recaptcha-response'], et le second doit être l'IP.
    Dans ton code, la méthode est "verifyResponse()" donc soit une autre lib ou une autre version mais ça pourrait être intéressant de vérifier.

  3. #3
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Novembre 2013
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 99
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Merci pour ta réponse avec différentes pistes de recherche.
    Mais comme tu peux le voir en représentation par images, le captcha s'affiche sur mon site.
    Cela indépendamment du fichier recuperation.php.

    En fait, j'ai réussi à fusionner les fichiers et résolu seul la question.

    Si ces fichiers t' intéressent, je peux te les envoyer.

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/09/2019, 08h28
  2. Demander un mot de passe pour modifier une cellule excel
    Par statista dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/09/2011, 09h25
  3. Formulaire pour recuperer son mot de passe
    Par Jean73 dans le forum Langage
    Réponses: 4
    Dernier message: 28/03/2006, 12h30
  4. Mise en réseau OK mais demande de mot de passe ???
    Par fute dans le forum Sécurité
    Réponses: 13
    Dernier message: 27/07/2005, 17h34
  5. Réponses: 3
    Dernier message: 26/01/2005, 07h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo