Login - Password PHP

Résolu
M_Tufux Messages postés 85 Statut Membre -  
jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   -
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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Et pour l'utiliser, il te suffit de faire :
      $cnn = get_cnx();
      
      0
      1. M_Tufux Messages postés 85 Statut Membre > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Yeep 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
      2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > M_Tufux Messages postés 85 Statut Membre
         
        https://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
    2. M_Tufux Messages postés 85 Statut Membre
       
      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
  2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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