vérifier un mot de passe dans la bdd avec password_verify

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

vérifier un mot de passe dans la bdd avec password_verify

Par Bogard  -  3 reponses  -  Le 25/08/2018 11:57  -  Editer  - 

toute fois que je veux me connecter le mot de passe ne correspond pas et j'ai toujours ce message d'erreur

première

    Notice: Trying to get property of non-object in C:\wamp\www\institut\pages_interface\Registre.php on line 44  

DEUXIEME:

    Notice: Undefined property: PDOStatement::$mdp in C:\wamp\www\institut\pages_interface\Registre.php on line 45  

voici mon code :

    if(!empty($_POST)){  

        $user ="";  
        $erreurs = array();  
        include_once '../inc/bdConnect.php';  
        include_once '../fonction/CreerFunction.php';  

            if(empty($_POST['nom'])){  
                 $erreurs['nom']= "veuilez entrez votre nom";  
            } else {  
                $req = $bdd ->prepare('SELECT id FROM etudiant WHERE nom = ?');  
                $req ->execute([$_POST['nom']]);  
                $user = $req->fetch();  
                if($user){  
                    //$erreurs['nom'] ="Ce nom exixte";  
                }elseif ($user != $_POST['nom']) {  
                    $erreurs['nom'] ="Votre nom n'est pas le même veillez revérifier";  

                }  
            }  
            if(empty($_POST['prenom'])){  
               $erreurs['prenom']="Veuilez entrez votre prénom";  
            }else {  
                $req = $bdd ->prepare('SELECT id FROM etudiant WHERE prenom = ?');  
                $req ->execute([$_POST['prenom']]);  
                $user = $req->fetch();  
                if($user){  
                   // $erreurs['prenom'] ="Votre Prenom n'est pas le même veillez revérifier";  
                }elseif ($user != $_POST['prenom']) {  
                    $erreurs['prenom'] ="Votre Prenom n'est pas le même veillez revérifier";  

                }  

            }  
            if(empty($_POST['mdp'])){  
                $erreurs['mdp']="Entrer votre mot de passe";  

            }else {  
                $req = $bdd ->prepare('SELECT id FROM etudiant WHERE mdp =?');  
                $req ->execute([$_POST['mdp']]);  
                $user = $req->fetch();  
                show_erreur($_POST['mdp']);  
                show_erreur($user->mdp); // cause problème ligne 44  
               if(password_verify($_POST['mdp'],$req->mdp)){//ligne 45  
                    exit();  

                }  
                else {  
                    $erreurs['mdp'] ="Votre mot de passe n'est pas le même veillez revérifier";  

                }  

            }  

            if(empty($erreurs)){  
                session_start();  
                $_SESSION['nom'] = $_POST['nom'];  
                header('location:PageMembre.php');  
            }//var_dump($erreurs);  
            show_erreur($erreurs);  
    }   

    ?>
 

Réponses apportées à cette discussion

Par Cyrano  -  Le 26/08/2018 11:53  -  Haut de page  - 

Salut,
je m'interroge sur cette manière d'identifier un utilisateur en effectuant trois requêtes successives.

Et ce sont surtout les deux premières requêtes qui me semblent pour le moins curieuses : pourquoi donc effectuer d'abord une recherche sur le nom, ensuite une autre sur le prénom et enfin une troisième sur le mot de passe au lieu de ne faire qu'une seule requête qui vérifie les trois en même temps.

On peut en effet considérer la possibilité de plus d'un utilisateur portant le nom vérifier, la même chose pour le prénom. Ce qui en principe distingue chaque utilisateur de façon unique, c'est son mot de passe. Donc il n'est pas cohérent de diviser la vérification en trois requêtes successives les deux premières ne servant pas à grand chose.

Sur la requête sur le mot de passe, ça semble indiquer que les mots de passe sont enregistrés dans la base de donnée en clair et non hachés ou chiffrés... coté sécurité, c'est assez mauvais.

Quant aux erreurs :
- celle de la ligne 44 pourrait indiquer une erreur d'exécution dans la requête et MySQL aurait retourné une erreur et non un résultat attendu, même vide;
- celle de la ligne 45, elle est tout à fait possible si la requête retourne un résultat vide parce qu'aucune correspondance n'a été trouvée.

Suggestion : tester d'abord les requêtes manuellement dans MySQL via phpMyAdmin ou encore dans le client MySQL en ligne de commande pour vérifier ce qui est retourné. Une fois que les résultats obtenus sont satisfaisants, alors les formater en requêtes préparées dans le code.

Petite astuce : activer les logs de requêtes MySQL et vérifier quelles requêtes sont effectivement exécutées lorsque ce script est appelé.

 
Par Bogard  -  Le 27/08/2018 09:44  -  Haut de page  - 

Bonjour Cyrano j'ai lu ta remarque, elles sont pertinentes... j'ai pu faire la vérification en une seule fois comme tu me l'as conseillé je placerais le code ici, cependant en ce qui concerne le mot de passe il n'est pas en claire dans le bdd il est crypté, avec password_hash().

voici mon fichoer RegistreEleve.php

    if(!empty($_POST)){  
        $erreurs = array();  
        include_once '../inc/bdConnect.php';  
        if(empty($_POST['pseudo'])){  
                 $erreurs['pseudo']= "veuilez entrez votre nom";  
            } else {  
                $req = $bdd ->prepare('SELECT id FROM etudiant WHERE pseudo = ?');  
                $req ->execute([$_POST['pseudo']]);  
                $user = $req->fetch();  
                if($user){  
                    $erreurs['pseudo'] ="Le pseudo est déjà utilisé";  
                }  
            }  
        if(empty($_POST['nom'])){   
                  $erreurs['nom']="Veuilez correctement entrez votre nom";  
        }  
        if(empty($_POST['prenom'])){  
             $erreurs['prenom']="veuilez entrez Correctement votre prénom";  
        }  
        if(empty($_POST['mdp'])){  
               $erreurs['mdp']="Le champ n'a pas été rempli";  
            } elseif($_POST['mdp']!= $_POST['mdp2']){  
                $erreurs['mdp']="Les mots de pass ne sont pas identiques";  

              }  
              if(empty($erreurs)){  
                  $req = $bdd ->prepare('INSERT INTO etudiant(pseudo,nom,prenom,mdp)VALUES(:pseudo,:nom,:prenom,:mdp)');  
                  $mdp = password_hash($_POST['mdp'], PASSWORD_BCRYPT);  
                  $req->execute(array(  
                      'pseudo' =>$_POST['pseudo'],  
                      'nom' =>$_POST['nom'],  
                      'prenom' =>$_POST['prenom'],  
                      'mdp' =>$mdp));  
                  header('location:Registre.php');// page de connexion  
              }  
              var_dump($erreurs);    

    }    


    ?>  
    <!DOCTYPE html>  
    <html>  
        <head>  
            <meta http-equiv="content-type" content="text/html;charset=utf-8" />  
            <link rel="stylesheet"  href="http://localhost/gestion_eleve/css/css1.css" />  

        </head>  
        <body>  
            <form method="POST" action="RegistreEleve.php">  
                <fieldset>  
                    <h3>CONNEXION</h3>  
                    <table>  
                     <tr>  
                    <td>  
                        Pseudonyme  
                    </td>  
                    <td>  
                        <input type="text" name="pseudo" id="co">  
                    </td>     
                    <tr>  
                    <td>  
                        Nom  
                    </td>  
                    <td>  
                        <input type="text" name="nom" id="co">  
                    </td>  
                </tr>      
                <tr>  
                    <td>  
                        Prénom  
                    </td>  
                    <td>  
                        <input type="text" name="prenom" id="co">  
                    </td>  
                </tr>  
                <tr>  
                <!--<td>  
                    Description  
                </td>  
                <td>  
                     <textarea name="Description" id="descrip" rows="4" cols=""></textarea>  
                 </td>  
                </tr>-->  


            <tr>  
                <tr>  
                    <td>  
                        <label>Mot de pass</label>  
                    </td>  
                    <td>  
                        <input type="password" name="mdp" id="co">  
                    </td>  
                </tr>  
                <tr>  
                    <td>  
                        Confirmer le passe  
                    </td>  
                    <td >  
                        <input type="password" name="mdp2" id="co">  
                    </td>  
                </tr>  
            </table>  
                </fieldset>  

                <p><input type="submit" name="ok" value="inscription" id="cor"><p>  



            </form>  

        </body>  



    </html>  

ET voici le fichier Registre.php qui permettra de se connecter :

    <?php  
        include_once '../fonction/CreerFunction.php';  
    if(!empty($_POST) && !empty($_POST['nom']) && !empty($_POST['prenom']) && !empty($_POST['mdp'])){  

        $erreurs = array();  
        include_once '../inc/bdConnect.php';  
        $req = $bdd ->prepare('SELECT * FROM etudiant WHERE nom =:nom and prenom = :prenom');//je sais si c'est juste  
        $req->execute(  
                array(  
                    'nom'=>$_POST['nom'],  
                    'prenom'=>$_POST['prenom']  
            ));  
        $user = $req->fetch();  
        show_erreur($_POST['mdp']); // SA marche  
        show_erreur($user->mdp);// SA MARCHE AUSSI  
        if(password_verify($_POST['mdp'], $req->mdp)){ // voici la ligne qui bloque  
                    exit();  
        }else {  
                $erreurs['mdp'] ="Votre mot de passe n'est pas le même veillez revérifier";  
            }          

            if(empty($erreurs)){  
                session_start();  
                $_SESSION['nom'] = $_POST['nom'];  
                header('location:PageMembre.php');  
            }//var_dump($erreurs);  
            show_erreur($erreurs);  
    }   

    ?>  
    <!DOCTYPE html>  
    <html>  
        <head>  
            <meta http-equiv="content-type" content="text/html;charset=utf-8" />  
            <link rel="stylesheet"  href="http://localhost/gestion_eleve/css/css1.css" />  

        </head>  
        <body>  
            <form method="POST" action="Registre.php">  
                <fieldset>  
                    <h3>CONNEXION</h3>  
                    <table>  
                    <tr>  
                    <td>  
                        Nom  
                    </td>  
                    <td>  
                        <input type="text" name="nom" id="co">  
                    </td>  
                </tr>      
                <tr>  
                    <td>  
                        Prénom  
                    </td>  
                    <td>  
                        <input type="text" name="prenom" id="co">  
                    </td>  
                </tr>  
                <tr>  
                <!--<td>  
                    Description  
                </td>  
                <td>  
                     <textarea name="Description" id="descrip" rows="4" cols=""></textarea>  
                 </td>  
                </tr>-->  


            <tr>  
                <tr>  
                    <td>  
                        <label>Mot de pass</label>  
                    </td>  
                    <td>  
                        <input type="password" name="mdp" id="co">  
                    </td>  
                </tr>  

            </table>  
                </fieldset>  

                <p><input type="submit" name="ok" value="Connexion" id="cor"><p>  



            </form>  

        </body>  



    </html>  

je ne fait que débuter en php , je suis pas encore un ace...

voici l'erreur qui est renvoyé :

    Notice: Undefined property: PDOStatement::$mdp in C:\wamp\www\institut\pages_interface\Registre.php on line 16
 
Par Cyrano  -  Le 27/08/2018 10:18  -  Haut de page  - 

Peut-être que remplacer

if(password_verify($_POST['mdp'], $req->mdp))

par

if(password_verify($_POST['mdp'], $user->mdp))

fonctionnerait mieux, non ?

J'ajoute quand même qu'appeler exit() en cas d'erreur n'est pas la manière la plus conviviale pour l'utilisateur qui devra alors recharger la page pour afficher à nouveau le formulaire de connexion.

Autre point : dans le formulaire, les champs nom et prenom on le même attribut id="co", ce qui est d'abord une erreur et ensuite peut générer des erreurs dans certains cas.

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !