Login - Password PHP

Résolu
Hello,

Je n'arrive pas à faire correctement cette fonction de login. J'ai lié un fichier index.php dans lequel j'ai mis la session, vous le remarquerez avec le return true dans register.

Première question, pourquoi Est-ce que le password verify ne fonctionne pas?
Ensuite, je ne sais plus comment gérer l'erreur dans la fnc Register. L'erreur, c'est à dire si la BD ne répond pas ou qqch du genre.

<?php


	function Login($user, $pass){
		$pass = password_hash($pass, PASSWORD_DEFAULT);
		$userdb = 'root';
		$passdb = '';
		$cnn = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
		$stmt = $cnn->prepare('SELECT UserName, Password FROM login WHERE UserName   = :user');
		$stmt->bindParam(':user', $user);
		$stmt -> execute();
		$row = $stmt->fetch(PDO::FETCH_OBJ);
		print $row->Password;

		if(password_verify($pass, $row->Password)){
			echo 'hellow';
		}
	}
	
	function Register($user, $pass){
		$pass = password_hash($pass, PASSWORD_DEFAULT);
		$userdb = 'root';
		$passdb = '';
		$cnn = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
		$stmt = $cnn->prepare('INSERT INTO login (UserName, Password) VALUES (:user, :pass)');
		$stmt->bindParam(':user', $user);
		$stmt->bindParam(':pass', $pass);
		$stmt -> execute();
		return true;
	}



?>


J'accepterais avec plaisir de l'aide :)

Merci beaucoup!!

2 réponses

  1. Modérateur
    Histoire d'améliorer un peu :
    Index.php
    <?php
     session_start();
     include('head.php');
     $error = '';
     $bLogin = false;
     $bRegister = false;
     
     //VERIFIE SI FORMULAIRE ENVOYÉ OU PAS
     if(isset($_POST['deco'])){
      session_destroy();
     }
      
      
      // Récupération PROPRE des variables AVANT de les utiliser :
      $userName = !empty($_POST['userName']) ? $_POST['userName'] : NULL;
      $password = !empty($_POST['pass']) ? $_POST['pass'] : NULL;
      
      $user = isset($_SESSION['user']) ? $_SESSION['user'] : ""; 
      
     if($userName && $pass)){
    
       if(isset($_POST['valider'])){
        $bLogin = Login ($userName, $password);
        if($bLogin == true){
         $_SESSION['user'] = $userName;
        } else {
         echo "LOGIN OU MOT DE PASSE INVALIDE";
        }
       }
          
       if(isset($_POST['register'])){
        $bRegister = Register($userName, $password);
        if($bRegister == true){
         $_SESSION['user'] = $userName;
        }
       }
       
      }
      else{
       $error = 'Veuillez remplir tous le champs!';
      }
    
    
    ?>
    <!DOCTYPE HTML>
    <html>
     <head>
      <meta charset="utf8">
      <title></title>
     </head>
     <body>
      <!-- FORMULAIRE AVEC LOGIN MDP -->
      <div id="divIndex1">
       <form action="" method="POST">
        <label class="login">Nom d'utilisateur</label><input class="inputLogin" type="text" name="userName" /><br/>
        <label class="login">Mot de passe</label><input class="inputLogin" type="password" name="pass"><br/>
        <label id="login-submit"><?php echo $error; ?></label><input class="inputLogin" type="submit" name="valider" value="valider"/>
        <input class="inputLogin" type="submit" name="register" value="s'enregistrer"/><br/>
        <?php echo $user;} ?>
       </form>
          <?php
          if(!empty($user)){
          ?>
          <form action="" method="POST">
        <input class="inputLogin" type="submit" name="deco" value="se déconnecter"/>
       </form>
          <?php
          }
          ?>
      </div>
     </body>
     
     <?php include('footer.php'); ?>
    </html>
    
    


    Fichier de connexion à la bdd
    <?php
    // fichier de connexion à la bdd : cnxBdd.php
    function get_cnx(){
     $bdd = NULL;
     $userdb = 'root';
     $passdb = ''; 
     try{
      $bdd = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::ASSOC);
     } catch(PDOException $e) {
        die('Erreur : ' . $e->getMessage());
     }
     return $bdd;
    }
    
    


    Tes autres codes :
    <?php
    
    //Import fichier de connexion à la bdd
    require_once "cnxBdd.php";
    
    
    /**
    * Foncion LOGIN
    */
    function Login($user, $pass){
      $cnn = get_cnx();
      try{
        $stmt = $cnn->prepare('SELECT UserName, Password FROM login WHERE UserName = :user');
        $stmt->bindParam(':user', $user);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_OBJ);
      }catch(Exception $e){
        echo "Error !" .$e->getMessage();
      }
       //print $row->Password;
      return  password_verify($pass, $row->Password) ? true : false ;
    }
    
    /**
    * Foncion REGISTER
    */
    function Register($user, $pass){
      $pass = password_hash($pass, PASSWORD_DEFAULT);
    
      $cnn = $cnn = get_cnx();
      try{
        $stmt = $cnn->prepare('INSERT INTO login (UserName, Password) VALUES (:user, :pass)');
        $stmt->bindParam(':user', $user);
        $stmt->bindParam(':pass', $pass);
        $result = $stmt->execute();
      }catch(Exception $e){
        echo "Error !" .$e->getMessage();
        $result = false;  
      }
      return $result;
    } 
    
    1
    1. Modérateur
      Bonjour,

      1 - Place le code de connexion à ta BDD à part ... pour ne pas avoir à la réécrire à chaque fois ...

      2 - Active la gestion des erreurs PDO
      voir ici : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

      3 - Voici un petit exemple :
      <?php
      // fichier de connexion à la bdd : cnxBdd.php
      function get_cnx(){
       $bdd = NULL;
       try{
        $bdd = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
       } catch(PDOException $e) {
          die('Erreur : ' . $e->getMessage());
       }
       return $bdd;
      }
      
      
      


      1
      1. Modérateur
        Et pour l'utiliser, il te suffit de faire :
        $cnn = get_cnx();
        
        0
      2. @jordane45Yeep merci pour ta réponse, mais ça ne répond pas à ma première question qui était "pourquoi Est-ce que le password_verify ne fonctionne pas"
        0
      3. Modérateur
        @M_Tufuxhttps://www.php.net/manual/fr/function.password-verify.php
        - As tu vérifié ce que contenait ta variable $row->Password ?
        - Ton champ Password dans ta BDD est dimensionné à combien de caractères ?
        - Tu as fais un echo du hash dans ta fonction register pour voir si la valeur en BDD est correctement stockée ?
        - Tu as quelle version de php ?
        0
      4. Hello,

        C'est bon j'ai trouvé. J'avais hashé le mot de passe avant de le mettre dans le verify.

        Et il y a LARGEMENT moyen d'optimiser tout ça. Le but de ce test était justement de me remettre dans le bain. L'optimisation peut-être que je m'en occuperai plus tard.

        Voici mon code en vrac:
        index.php
        
        <?php
        	session_start();
        	include('head.php');
        	$error = '';
        	$userName = '';
        	$password = '';
        	$bLogin = false;
        	$bRegister = false;
        	
        	//VERIFIE SI FORMULAIRE ENVOYÉ OU PAS
        	if(isset($_POST['deco'])){
        		session_destroy();
        	}
        	if(isset($_POST['userName']) && isset($_POST['pass'])){
        		if(!empty($_POST['userName']) && !empty($_POST['pass'])){
        			$userName = $_POST['userName'];
        			$password = $_POST['pass'];
        			if(isset($_POST['valider'])){
        				$bLogin = Login ($userName, $password);
        				if($bLogin == true){
        					$_SESSION['user'] = $userName;
        				}
        				else{
        					echo "LOGIN OU MOT DE PASSE INVALIDE";
        				}
        			}
        			if(isset($_POST['register'])){
        				$bRegister = Register($userName, $password);
        				if($bRegister == true){
        					$_SESSION['user'] = $userName;
        				}
        			}
        			
        		}
        		else{
        			$error = 'Veuillez remplir tous le champs!';
        		}
        	}
        
        ?>
        
        <!DOCTYPE HTML>
        <html>
        	<body>
        		<!-- FORMULAIRE AVEC LOGIN MDP -->
        		<div id="divIndex1">
        			<form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
        				<label class="login">Nom d'utilisateur</label><input class="inputLogin" type="text" name="userName" /><br/>
        				<label class="login">Mot de passe</label><input class="inputLogin" type="password" name="pass"><br/>
        				<label id="login-submit"><?php echo $error; ?></label><input class="inputLogin" type="submit" name="valider" value="valider"/>
        				<input class="inputLogin" type="submit" name="register" value="s'enregistrer"/><br/>
        				<?php if(isset($_SESSION['user'])){echo $_SESSION['user'];} ?>
        			</form>
        			<form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
        				<input class="inputLogin" type="submit" name="deco" value="se déconnecter"/>
        			</form>
        		</div>
        	</body>
        	
        	<?php include('footer.php'); ?>
        </html>
        


        <?php

        function Login($user, $pass){
        $userdb = 'root';
        $passdb = '';
        $cnn = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
        $stmt = $cnn->prepare('SELECT UserName, Password FROM login WHERE UserName = :user');
        $stmt->bindParam(':user', $user);
        $stmt -> execute();
        $row = $stmt->fetch(PDO::FETCH_OBJ);
        print $row->Password;

        if (password_verify($pass, $row->Password)) {
        return true;
        } else {
        return false;
        }
        }

        function Register($user, $pass){
        $pass = password_hash($pass, PASSWORD_DEFAULT);
        $userdb = 'root';
        $passdb = '';
        $cnn = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
        $stmt = $cnn->prepare('INSERT INTO login (UserName, Password) VALUES (:user, :pass)');
        $stmt->bindParam(':user', $user);
        $stmt->bindParam(':pass', $pass);
        $stmt -> execute();
        return true;
        }

        ?>

        MySQL.php
        
        
        
        


        Encore merci pour ton aide Jordane45
        Bonne soirée!
        0