Partage
  • Partager sur Facebook
  • Partager sur Twitter

connection automatique - petite confirmation

    15 février 2019 à 11:25:00

    Bonjour,

    Je me demande en écrivant si ma question n'est pas un peu bête...

    J'ai réalisé du code pour pouvoir enregistrer le pseudo et le mot de passe d'un visiteur dans deux cookies. J'ai mis une case à cocher permettant au visiteur de se connecter automatiquement.

    Dans le code, j'ai demandé à ce que si le visiteur coche cette case, le pseudo et mot de passe s'inscrivent automatiquement dans les champs du formulaire et qu'il n'ait plus qu'a cliqué sur Se connecter.

    J'ai l'impression que tout fonctionne mais je n'en suis pas sûre...

    Ensuite, je me connecte en cochant la case et j'opte à la première connection pour une connection automatique, j'ai deux situations :

    - j'accepte la proposition de mon navigateur pour mémoriser le mot de passe -> dans ce cas, mes deux champs se remplissent automatiquement et - apparemment tout est bon.

    - je ne confirme pas que je souhaite que le navigateur mémorise le mot de passe -> il ne s'inscrit plus automatiquement malgré le fait que je le demande dans mon code.

    Du coup, cela veut il dire que mon code n'est pas bon ou est-il nécessaire de confirmer l'accord sur la page web pour que ces champs se remplissent automatiquement ? Merci par avance !

    Au cas ou cela soit utile pour mieux comprendre, je joins ci-dessous mon code :

    if(isset($_COOKIE['pseudo']) AND isset($_COOKIE['pass']) AND isset($_COOKIE['connectionauto'])) {
     
     $req = $bdd->prepare("SELECT pseudo, pass FROM members WHERE pseudo=?, pass=?");
     $req->execute(array($_POST['pseudo']), $_POST['pass']);
     
         $donnees = $req->fetch();
     
     
      if ($pseudo == $donnees['pseudo'] AND password_verify($pass, $donnees['pass'])) {
     
                  $_SESSION['pseudo'] = $pseudo;
                $_SESSION['pass'] = $pass;
     setcookie('cookiepseudo', $_POST['pseudo'], time()+365*24*3600, null,null,false,true);
     setcookie('cookiepass',$_POST['pass'], time()+365*24*3600, null, null, false, true);
                      
                  header('Location: connectionv2.php');
                  $req->closeCursor();
                  exit();
                }
                else {
                  header('Location:https://www.google.fr');
                  exit();
                }
    }
    
    <!DOCTYPE html>
    	<html lang="fr">
    		<head>
    			<meta charset="utf-8">
    			<meta name="viewport" content="width=device-width, initial-scale=1"/>
    			 <link rel="stylesheet" href="cssandfonts/style.css" />
    			<title> Connection </title>
    		</head>
    
    
    		<body>
                
                <h1>Les blogotteurs</h1>
                
                <h2> Bienvenue sur <em>le </em>site référence des <em>vrais</em> voyageurs ! </h2> <br/>
                
                <form method="post" action="connection_post_v2.php">
                    
                    <p> Pour vous connecter, veuillez renseigner les champs suivants :  <br/> </p>
                
                    <p>
                        <label for="pseudo">Votre pseudo : </label> <input type="text" id="pseudo" name="pseudo" value="<?php if(isset($_COOKIE['cookiepseudo'])) {echo $_POST['pseudo']; } ?>" /> <br/>
                        
                        <label for="pass">Votre mot de passe : </label> <input type="password" id="pass" name="pass" value="<?php if(isset($_COOKIE['cookiepass'])) {echo $_POST['pass'];}?>"/> 
                            <br/>
    
                        <input type="checkbox" name="connectionauto" id="connectionauto"/> <label for="connectionauto">Connection automatique</label> <br/>  
                        
                        <input type="submit" value="Se connecter"/> <br/>
                        
                    </p>
               
                </form>
            
             
                
            
                
                
             </body>
            
    </html>



    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2019 à 11:27:52

      Salut,

      Juste pour info', on enregistre JAMAIS le mot de passe en cookie.

      • Partager sur Facebook
      • Partager sur Twitter
        15 février 2019 à 11:32:38

        Bonjour,

        idem : le remplissage auto doit être fait par le navigateur si l'utilisateurice le décide, mais certainement pas le site. Par contre, tu peux enregistrer un cookie pour maintenir/contourner la connexion (le fameux "se souvenir de moi").

        • Partager sur Facebook
        • Partager sur Twitter

        Pas d'aide concernant le code par MP, le forum est là pour ça :)

          15 février 2019 à 11:41:30

          Merci pour vos reponses. En fait, j'ai du mal m'exprimer mais ce que je veux faire est un 'se souvenir de moi'. C'est pour cela que je voulais recuperer le mots de passe et pseudo. Donc, je retiens que le mot de passe a memoriser dans un cookie: a ne pas faire. Cependant, si on peut pas memoriser le mot de passe, qu'il ne doit pas etre resaisi par l'utilisateur et qu'une session ne conserve les informations que durant la connection, je ne vois pas comment on peut coder cette fonctionnalites. Merci.

          • Partager sur Facebook
          • Partager sur Twitter
            15 février 2019 à 11:57:33

            "Se souvenir de moi" c'est un bypass (arrêtez-moi si je me trompe). C'est simplement un cookie, que le site va aller vérifier de temps en temps : s'il est là, ok, on fait une connexion fantôme. Sinon, on renvoie le fait qu'on n'est pas connecté⋅e et on redirige vers la page idoine.

            • Partager sur Facebook
            • Partager sur Twitter

            Pas d'aide concernant le code par MP, le forum est là pour ça :)

              15 février 2019 à 13:57:51

              Oui en gros c'est l'idée mais pour faire ça il faut générer un token dans la ligne de la bdd ou se trouve le membre (exemple de token : "unTokenCompliquer" et dans le cookie tu y stoque l'id + le token séparé par un caractère spécial.

              Par exemple comme valeur tu aurai : "12---unTokenCompliquer" , et comme nom : "remember" (par exemple)

              Maintenant sur chaque requête tu fera une condition du style : si pas de session['member'] mais qu'il y a un cookie['remember'].

              Et si c'est le cas faudra récupérer l'id du membre et le token et check en base si un membre existe, le connecter en mettant les informations voulu dans la session et ne pas oublier de régénérer un token pour cette utilisateur.

              • Partager sur Facebook
              • Partager sur Twitter
                18 février 2019 à 7:27:35

                Merci pour vos réponses, je travaille dessus. Bonne journée.
                • Partager sur Facebook
                • Partager sur Twitter
                  18 février 2019 à 12:21:26

                  Salut , pas besoin de isset(baba) AND isset(babar)

                  isset prend plusieurs paramètres , ce n'est pas un fonction mais une structure de contrôle .

                  Ex :

                  // PSR 2
                  if (isset($goku, $vegeta, $vegito)) {
                   
                    //renvoi true si ils existent tous
                  } else {
                    // sinon Boo gagne
                  }

                   Proposition d'amélioration :

                  if(isset($_COOKIE['pseudo'], $_COOKIE['pass'], $_COOKIE['connectionauto'])) {
                  	$pseudo = $_POST['pseudo'];
                  	$pass = $_POST['pass']; 
                  	
                  	/* requête avec marqueur */
                      $req = $bdd->prepare("SELECT pseudo, pass FROM members WHERE pseudo=?");
                  	
                  	/* requête avec paramètre nommé */
                  	//$req = $bdd->prepare("SELECT pseudo, pass FROM members WHERE pseudo=:pseudo");
                  	
                  	/* execute type 1 */
                      $req->execute(array($pseudo));
                  	
                  	/* execute type 2, s'utilise avec les paramètres nommés */
                  	//$req->bindValue(":pseudo",$pseudo);
                  	//$req->execute();
                  	
                      $donnees = $req->fetch(PDO::FETCH_ASSOC);
                      if($donnees) {
                          $ok = $pseudo === $donnees['pseudo'] && password_verify($pass, $donnees['pass']);
                          if($ok) {
                              $_SESSION['pseudo'] = $pseudo;
                              $_SESSION['pass'] = $pass;
                              setcookie('cookiepseudo', $pseudo, time()+365*24*3600, null,null,false,true);
                              setcookie('cookiepass', $pass, time()+365*24*3600, null, null, false, true);
                          } else {
                              header('Location: connectionv2.php');
                          }
                      } else {
                          header('Location: connectionv2.php');
                      }
                  
                  }



                  -
                  Edité par JohnNes 18 février 2019 à 12:48:57

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 février 2019 à 6:30:48

                    Bonjour,

                    Merci à tous ceux qui ont répondu. Merci John Nes pour ce code mais je ne parviens tout de même pas à faire fonctionner le Se souvenir de moi...

                    J'ai cherché depuis hier et testé un autre code :

                    <?php
                    session_start();
                    
                    //connection bdd
                      $conn = new mysqli('localhost', 'root', 'globetrotter2018', 'espace_membre') or die(mysqli_error());
                     
                    
                    if(isset($_POST["submit"])){
                     $sql= "SELECT * FROM membre WHERE pseudo = '".$_POST["pseudo"]. "' AND motdepasse = '" .$_POST["mdp"]."'";
                     $query = mysqli_query($conn, $sql);
                     $res = mysqli_fetch_assoc($query);
                        if($res)
                            {
                            if(!empty($_POST["rememberme"]))
                                    {
                                        setcookie ("pseudo", $_POST["pseudo"], time() + (10 * 365 * 24 * 60 * 60));
                                        setcookie ("mdp", $_POST["mdp"], time() + (10 * 365 * 24 * 60 * 60));
                                    }
                                else
                                    {
                                        if(isset($_COOKIE["pseudo"]))
                                            {
                                                setcookie ("pseudo", "");
                                            }
                                        if(isset($_COOKIE["mdp"]))
                                            {
                                                setcookie ("mdp", "");
                                            }
                                    }
                            header('location:accueil_membres_ca_marche.php');
                                    }
                                        else
                                            {
                                                echo "Pseudo et/ou mot de passe invalide(s)";
                                            }
                                                }
                    
                    ?>
                    
                    
                    
                    <!DOCTYPE html>
                    	<html lang="fr">
                    		<head>
                    			<meta charset="utf-8">
                    			<meta name="viewport" content="width=device-width, initial-scale=1"/>
                    			 <link rel="stylesheet" href="style_inscription.css" />
                    			<title> Connection à l'espace membre </title>
                    		</head>
                    
                    
                    		<body>
                                
                                <h1>Les blogotteurs</h1>
                                
                                <h2> Bienvenue sur <em>le </em>site référence des <em>vrais</em> voyageurs ! </h2> <br/>
                                
                                <form method="post" action="aaa.php">
                                    
                                    <p> Pour vous connecter, veuillez renseigner l'ensemble des champs suivants :  <br/> </p>
                                
                                    <tr>
                                        <td>
                                        <label for="pseudo">Votre pseudo : </label> 
                                        </td>
                                        
                                        <td>
                                        <input type="text" id="pseudo" name="pseudo" placeholder="Votre pseudo" value="<?php if(isset($_COOKIE["pseudo"])) {echo $_COOKIE['pseudo'];} ?>"/> <br/>
                                        </td>
                                    </tr>
                                    
                                                
                                    <tr>
                                        <td>
                                        <label for="mdp">Votre mot de passe : </label> 
                                        </td>
                                        
                                        <td>
                                        <input type="password" id="mdp" name="mdp" value="<?php if(isset($_COOKIE["mdp"])) {echo $_COOKIE["mdp"];}?>"/> <br/> 
                                        </td>
                                        
                                    </tr>
                                            
                    
                                   <label for="rememberme"> Se souvenir de moi </label>
                                    <input type="checkbox" id="rememberme" name="rememberme" <?php if(isset($_COOKIE["pseudo"])) {?> checked <?php } ?>/>
                                        
                                     <input type="submit" name="submit" value="Login">
                                    
                                                   
                                </form>
                                
                             </body>
                            
                    </html>



                    Le problème c'est que je ne comprends pas pourquoi mais une fois que j'ai ajouté login et mot de passe, j'ai le message d'erreur me disant qu'ils sont invalides (ce n'est pas le cas), les champs se vident et je ne change plus de page !

                    Voyez-vous d'où vient le bug? Merci.

                    -
                    Edité par laure79 19 février 2019 à 7:28:10

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 février 2019 à 9:01:39

                      Salut !

                      Si tu utilises une fonction de hachage pour enregistrer tes mots de passe, je doute que tu arrives à trouver un utilisateur avec le mot de passe en clair.

                      Autre chose : pourquoi avoir abandonné la requête préparée du premier message pour une concaténation dangereuse ? mysqli propose aussi de quoi gérer les requêtes préparées…

                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 février 2019 à 5:43:31

                        Bonjour Ymox,

                        Effectivement, les mots de passe ne correspondaient pas... J'ai repris mon ancien système plus sécurisé. 

                        A présent, j'ai refait mon code en essayant de conserver en cookie le mot de passe haché. Cependant, mon code ne fonctionne pas, je ne parviens plus à changer de page, il semblerait que quelque chose bloque au niveau de la correspondance mot de passe haché suite à la saisie de l'utilisateur et mot de passe haché de la base... Je ne comprends pas pourquoi ça bloque à présent. Du coup, je ne peux pas vérifier non plus, si ce que j'ai essayé de mettre en place pour la connection automatique fonctionne ou non. Merci par avance, désolée de vous déranger avec mon code mais je ne parviens pas à passer à l'étape suivante dépuis une semaine déjà. Vos conseils sont donc vraiment bienvenus :).

                        Revoici mon code :

                        <?php
                        
                        session_start();
                        
                                try 
                                    {
                                        $bdd=new PDO('mysql: host=localhost; dbname=''; charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
                                    }
                        
                                catch(Exception $e)
                                    {
                                        die('Erreur ' .$e ->getMessage());
                                    }
                                 
                        
                        ?>
                        
                        
                        
                        
                         
                        <!DOCTYPE html>
                        	<html lang="fr">
                        		<head>
                        			<meta charset="utf-8">
                        			<meta name="viewport" content="width=device-width, initial-scale=1"/>
                        			 <link rel="stylesheet" href="style_inscription.css" />
                        			<title> Connection à l'espace membre </title>
                        		</head>
                        
                        
                        		<body>
                                    
                                    <h1>Les blogotteurs</h1>
                                    
                                    <h2> Bienvenue sur <em>le </em>site référence des <em>vrais</em> voyageurs ! </h2> <br/>
                                    
                                    <form method="post" action="aaa_connection.php">
                                        
                                        <p> Pour vous connecter, veuillez renseigner l'ensemble des champs suivants :  <br/> </p>
                                    
                                        <tr>
                                            <td>
                                            <label for="pseudo">Votre pseudo : </label> 
                                            </td>
                                            
                                            <td>
                                            <input type="text" id="pseudo" name="pseudo" placeholder="Votre pseudo" value="<?php if(isset($_COOKIE["cookie_pseudo"])) {echo $_COOKIE['cookie_pseudo'];} ?>"/> <br/>
                                            </td>
                                        </tr>
                                        
                                                    
                                        <tr>
                                            <td>
                                            <label for="mdp">Votre mot de passe : </label> 
                                            </td>
                                            
                                            <td>
                                            <input type="password" id="mdp" name="mdp" value="<?php if(isset($_COOKIE["cookie_mdp"])) {echo $_COOKIE["cookie_mdp"];}?>"/> <br/> 
                                            </td>
                                            
                                        </tr>
                                        
                                       
                                        <input type="checkbox" id="rememberme" name="rememberme" value="<?php if(isset($_COOKIE["cookie_pseudo"])) {?> checked <?php } ?>"/>
                                          <label for="rememberme">Se souvenir de moi</label> 
                                        
                                        <input type="submit" value="Se connecter" name="submit" value="Login">
                                       
                                           
                                    </form>
                                    
                                 </body>
                                
                        </html>
                        
                        
                        
                        
                        <?php
                        
                                 
                            if(isset($_POST['submit']))
                                    {   
                                        if(isset($_POST['pseudo']) AND isset($_POST['mdp'])) 
                                            {
                                                $pseudo=$_POST['pseudo'];
                                                $mdp=$_POST['mdp'];
                                                $pass_hache = password_hash($_POST['mdp'], PASSWORD_DEFAULT); 
                                
                                //requete pour vérifier la correspondance
                        
                                                $req = $bdd->prepare("SELECT pseudo, motdepasse FROM membre WHERE pseudo=?");
                                                $req->execute(array($_POST['pseudo']));
                                                $donnees = $req->fetch();
                                            }
                                                else
                                                    {
                                                        echo 'Il est nécessaire de saisir votre pseudo ET votre mot de passe pour pouvoir vous connecter.';
                                                    }
                                
                                
                                
                                //password verify sur les deux mots de passe hachés
                                                if ($pseudo == $donnees['pseudo'] AND password_verify($pass_hache, $donnees['motdepasse']))   
                                                    {
                                             // enregistre en cession et cookies
                                                        $_SESSION['pseudo'] = $pseudo;
                                                        setcookie('cookie_pseudo', $_POST['pseudo'], time()+365*24*3600, null,null,false,true);
                                                        $_SESSION['mdp'] = $mdp;
                                                        setcookie('cookie_mdp',$_POST['mdp'], time()+365*24*3600, null, null, false, true);
                                                        
                                                        echo 'Vous êtes bien connectés';
                                                        header('location:accueil_membres.php');
                                                        
                                                        $req->closeCursor();
                        
                                                } else{
                                            echo 'Veuillez resaisir les champs, merci.';                        
                                                }   
                                
                                    } 
                           
                            ?>
                        
                        
                        
                        
                        



                        -
                        Edité par laure79 20 février 2019 à 5:44:27

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 février 2019 à 6:51:49

                          password_verify prends en premier paramètres le mot de passe en clair et non un hash qui de toute façon sera différent car il change à chaque utilisation de password_hash.

                          Ensuite ON NE STOQUE JAMAIS UN MOT DE PASSE EN DEHORS DE LA BDD. Même hash il ne faut jamais le stoquer dans un cookie ou une session.

                          Enfin ton header location ne marchera pas si le serveur n'a pas l'output buffering d'activé.

                          -
                          Edité par quenti77 20 février 2019 à 6:53:57

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 février 2019 à 8:12:38

                            Bonjour quenti77,

                            Merci pour ta réponse. Cependant, dans son cours, mathieu Nebra nous indique ceci :

                            "La page qui reçoit les données du formulaire de connexion doit vérifier le mot de passe en le comparant à celui stocké dans la base avec la fonction  password_verify  . Cette fonction va en fait hasher le mot de passe de l'utilisateur qui vient de se connecter et le comparer à celui qui était stocké en base de données."

                            et

                            "

                            Si le membre souhaite être reconnecté automatiquement (ce qu'il est conseillé de faire uniquement sur un ordinateur personnel, et non sur un ordinateur partagé avec d'autres personnes !), je vous invite à créer deux cookies qui stockeront respectivement :

                            • le pseudonyme ;

                            • le mot de passe haché.

                            Ainsi, si un visiteur non connecté qui possède ces deux cookies se présente, vous n'aurez qu'à vérifier si un membre correspond à ces informations en base de données et vous pourrez le connecter automatiquement, sans qu'il ait eu à utiliser le formulaire de connexion. Là encore, on prend une certaine mesure de sécurité en stockant le mot de passe haché dans un cookie et non le vrai mot de passe."

                            J'en conclue donc qu'il est possible de stocker en cookies le mot de passe haché et que c'est la méthode qu'il semble nous conseiller (du moins à ce stade, peut être y en a t'il de meilleure mais j'aimerai déjà parvenir à faire cela pour le moment).

                            Je me demandais donc pour quelle raison dis tu qu'il ne faut jamais enregistrer un mot de passe en cookie ? J'imagine que c'est un vrai problème de sécurité lorsqu'il n'est pas haché ? Mais s'il est haché, pourquoi ne pourrais je pas l'enregistrer en cookie ?

                            La redirection fonctionne de mon côté :).

                            Merci pour tes réponses.


                            Message 2 :

                            Je dois devenir chèvre... Je viens de modifier l'argument de la fonction password_verify et je parviens à présent à me connecter. Le problème c'est que maintenant, je peux me connecter avec n'importe quel mot de passe... Pourtant, j'ai mis des conditions et je peux me connecter malgré tout en mettant n'importe quoi...

                            <?php
                            
                                     
                                if(isset($_POST['submit']))
                                        {   
                                            if(isset($_POST['pseudo']) AND isset($_POST['mdp'])) 
                                                {
                                                    $pseudo=$_POST['pseudo'];
                                                    $mdp=$_POST['mdp'];
                                                    $pass_hache = password_hash($_POST['mdp'], PASSWORD_DEFAULT); 
                                    
                                    //requete pour vérifier la correspondance
                            
                                                    $req = $bdd->prepare("SELECT pseudo, motdepasse FROM membre WHERE pseudo=?");
                                                    $req->execute(array($_POST['pseudo']));
                                                    $donnees = $req->fetch();
                                                }
                                                    else
                                                        {
                                                            echo 'Il est nécessaire de saisir votre pseudo ET votre mot de passe pour pouvoir vous connecter.';
                                                        }
                                    
                                    
                                    
                                    //password verify sur les deux mots de passe hachés
                                                    if ($pseudo == $donnees['pseudo'] AND password_verify($_POST['mdp'], $pass_hache))   
                                                        {
                                                 // enregistre en cession et cookies
                                                            $_SESSION['pseudo'] = $pseudo;
                                                            setcookie('cookie_pseudo', $_POST['pseudo'], time()+365*24*3600, null,null,false,true);
                                                            $_SESSION['mdp'] = $mdp;
                                                            setcookie('cookie_mdp',$_POST['mdp'], time()+365*24*3600, null, null, false, true);
                                                            
                                                            echo 'Vous êtes bien connectés';
                                                            header('location:accueil_membres.php');
                                                            
                                                            $req->closeCursor();
                            
                                                    } else{
                                                echo 'Veuillez resaisir les champs, merci.';   
                                                header('aaa_connection.php');
                                                    }   
                                    
                                        } 
                               
                                ?>
                            
                             

                            -
                            Edité par laure79 20 février 2019 à 8:39:57

                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 février 2019 à 8:52:19

                              Tu es en train de vérifier que le mot de passe saisi est bien lui-même sous forme hachée (hachage de $_POST['mdp'] ligne 10, "comparaison" avec $_POST['mdp'] ligne 26).

                              Il faut que tu vérifies que le mot de passe saisi correspond au mot de passe haché que tu as récupéré depuis la base de données, mais pas encore utilisé.

                              -
                              Edité par Ymox 20 février 2019 à 8:52:33

                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 février 2019 à 8:57:38

                                C'est normal que cela marche car tu fait un password_verify sur le hash du mdp que l'utilisateur te donne dans le formulaire de connexion. Le résultat sera toujours vrai. Il faut que tu vérifie le mdp en claire du formulaire de connexion avec celui qui est stocké en base dans ta table membre.

                                Ensuite je confirme qu'on ne stock jamais un mot de passe ailleurs qu'en base car si le mec ce fait volé ces cookies pour une raison x ou y, alors le voleur pourra essayé de brute force le mdp par dictionnaire sans que le mec le sache. Si tu veux faire un "se souvenir de moi" voici la méthode que je préconise :

                                https://openclassrooms.com/forum/sujet/verification-dun-mot-de-passe-hache-stocke-cookie#message-92868426

                                PS: Ou voir au dessus je t'avais montrer la bonne façon de faire déjà :D

                                -
                                Edité par quenti77 20 février 2019 à 9:09:33

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  21 février 2019 à 6:46:41

                                  Bonjour quenti77,

                                  J'ai regardé ce que tu m'as envoyé, merci. J'ai finalement créé un token (pas salt à ce stade car je ne comprends pas encore comment m'y prendre). Je l'ai ajouté dans la base. J'ai aussi enregistré mes token et id en cookies, je travaille sur la suite même si je ne suis pas certaine de bien avoir saisi tes explications.

                                  Un autre point me chagrine: s'il faut vérifier l'identité de celui qui se connecte via son pseudo et mot de passe, on est obligé de comparer ce qu'il y a dans la base avec ce qu'il saisit. Hors, le mot de passe est haché dans la base et celui que saisit le visiteur  est à nouveau haché. Au final, les deux mots de passe ne correspondront pas. Comment peut on donc les vérifier ? Tu me dis qu'il faut ajouter le mot de passe en clair dans le fichier mais veux tu dire non haché ? On ne le connait pas ? Tout ceci n'est pas très clair pour moi. Merci.

                                  <?php
                                  
                                  session_start();
                                   
                                                  try 
                                                      {
                                                          $bdd=new PDO('mysql: host=localhost; dbname=espace_membre; charset=utf8', 'root', '1979&1978_', array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
                                                      }
                                  
                                                  catch(Exception $e)
                                                      {
                                                          die('Erreur ' .$e ->getMessage());
                                                      }
                                  
                                  
                                  if(isset($_POST['submit']))
                                  
                                              if(isset($_POST['pseudo']) AND isset($_POST['mdp'])) 
                                                  $pseudo=$_POST['pseudo'];
                                                  $mdp=$_POST['mdp'];
                                                  $pass_hache = password_hash($_POST['mdp'], PASSWORD_DEFAULT);                
                                          
                                                          // création d'une chaine aléatoire en bytes inutilisable en l'état
                                                          $token = random_bytes(16);
                                  
                                                          // transformation en caractères alphanumériques
                                                          var_dump(bin2hex(random_bytes(16)));
                                      
                                                          //requete pour enregistrer le token dans la base 
                                                          $req=$bdd->prepare('INSERT INTO membre(token) VALUES (?)');
                                                          $req->execute(array($_GET['token']));
                                      
                                      
                                                          // requete pour vérifier le mot de passe, le pseudo et l'id                        
                                                          $req = $bdd->prepare("SELECT id, pseudo, motdepasse FROM membre WHERE id=? AND pseudo=?");
                                                          $req->execute(array($_POST['id'], $_POST['pseudo']));
                                                          $donnees = $req->fetch();
                                          
                                                            //cas 1 : mot de passe et pseudo matchent => ouverture de session et connection à l'espace membre
                                                       //JE NE COMRPENDS PAS COMMENT JE SUIS CENSEE METTRE UN MOT DE PASSE EN CLAIR QUE JE NE CONNAIS PAS ?
                                                              if ($id == $donnees['id'] AND password_verify('druide', $pass_hache))
                                                                  {                                                            
                                                                      $_SESSION['id'] = $id;
                                                                      $_SESSION['token'] =$token;
                                                                                  
                                                                      header('location:accueil_membres.php');
                                                                  
                                                                      $req->closeCursor(); 
                                                                  
                                                                  //cas 2 : le visiteur veut se connecter et coche "rememberme" => creation de token, affiliation du token en cookie avec le pseudo aussi et connection
                                                                  
                                                                      } elseif ($id == $donnees['id'] AND password_verify('druide', $pass_hache AND $_POST['rememberme']){
                                                                         
                                                                          $pseudo = $_POST['pseudo'];
                                                                          $mdp = $_POST['mdp'];
                                                                          $pass_hache = password_hash($_POST['mdp'], PASSWORD_DEFAULT);                
                                          
                                                                          // création d'une chaine aléatoire en bytes inutilisable en l'état
                                                                          $token = random_bytes(16);
                                  
                                                                          // transformation en caractères alphanumériques
                                                                          var_dump(bin2hex(random_bytes(16)));
                                      
                                                                          //requete pour enregistrer le token dans la base 
                                                                          $req=$bdd->prepare('INSERT INTO membre(token) VALUES (?)');
                                                                          $req->execute(array($_GET['token']));
                                  
                                  
                                                                          // requete pour vérifier le mot de passe, le pseudo et l'id                        
                                                                          $req = $bdd->prepare("SELECT id, pseudo, motdepasse FROM membre WHERE id=? AND pseudo=?");
                                                                          $req->execute(array($_POST['id'], $_POST['pseudo']));
                                                                          $donnees = $req->fetch();
                                  
                                                                              //cas 1 : mot de passe et pseudo matchent => ouverture de session et connection à l'espace membre
                                                                   //JE NE COMPRENDS PAS COMMENT JE SUIS CENSEE METTRE UN MOT DE PASSE EN CLAIR QUE JE NE CONNAIS PAS ?
                                                                              if ($id == $donnees['id'] AND password_verify('druide', $pass_hache))
                                                                                  {                                                            
                                                                                      $_SESSION['id'] = $id;
                                                                                      $_SESSION['token'] =$token;
                                                                                      setcookie('cookie_pseudo', $donnees['pseudo'], time()+365*24*3600, null,null,false,true);
                                                                                      setcookie('cookie_token',$donnees['token'], time()+365*24*3600, null, null, false, true);
                                                                                      header('location:accueil_membres.php');
                                  
                                                                                      $req->closeCursor();                                    
                                                                               
                                                                              }
                                                                  //cas 3 : les mots de passe/identifiants ne matchent pas => on reddde la saisie ou l'inscription + lien
                                                                       
                                                                                      } else (!($pseudo==$donnees['pseudo'] AND password_verify('druide',$pass_hache))){
                                                                                          echo ' <p> Il y a une erreur dans votre saisie ou vous n\'avez pas de compte sur notre site. Si vous souhaitez en créer un, rendez-vous sur la <a href="aaa_inscription_ca_marche.php"> page d\'inscription </a> </p>.';
                                                              
                                                                                          }
                                  
                                                      
                                  ?>
                                  



                                  -
                                  Edité par laure79 21 février 2019 à 7:03:32

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 février 2019 à 9:11:01

                                    Lignes 40 et 41 : tu connais le mot de passe en clair, tu l'as reçu du formulaire. Mais tu dois le vérifier avec le mot de passe haché que tu as en base de données.
                                    password_verify() n'est pas une simple comparaison comme on le ferait avec $motDePasseSaisi == $motDePasseEnBaseDeDonnées, il prend en premier paramètre un mot de passe en clair et en second paramètre un mot de passe haché. D'où arrive un mot de passe en clair ? Et où est-ce que tu as un mot de passe haché sans que tu n'aies à le générer toi-même pour l'utilisateur qui tente de se connecter ?

                                    Tu récupères ce mot de passe haché avec la requête ligne 35 (entre autres informations), et re-récupères ligne 70. Et ainsi, tu as de quoi faire vérifier que le mot de passe saisi pour se connecter correspond à ce que l'utilisateur aurait choisi et qui est enregistré haché en base de données.

                                    Au passage, le cours est malheureusement un peu bancal. Il a fallu je-ne-sais combien de temps avant que l'utilisation qui était présentée pour password_verify() soit corrigée, et là j'ai bien l'impression que ce n'est que le code qui a été adapté, pas les explications autour. Avis à la rédaction…

                                    Au temps pour moi, ça a été fait en trois fois, mais le cours est clair à présent aussi.

                                    -
                                    Edité par Ymox 21 février 2019 à 9:31:32

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      21 février 2019 à 11:04:04

                                      Le hash ne sert juste que pour l'inscription

                                      Quand un user se connecte il ne faut plus  "hasher" quoi que ce soit , juste une comparaison comme l'a dit @Ymox

                                      On t'a déjà donné la solution , pourquoi compliquer les choses encore ?

                                      -
                                      Edité par JohnNes 21 février 2019 à 11:06:40

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        24 février 2019 à 12:36:20

                                        Merci a tous pour votre aide. Je regarde le code quentin77. Bonne journee.
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        connection automatique - petite confirmation

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown