Vérifier mdp en passhash avec algo Bcrypt en php,

Fermé
clara - Modifié le 19 août 2020 à 13:04
jordane45 Messages postés 38458 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 avril 2025 - 19 août 2020 à 13:10
Bonjour à tous,


j'ai créée une page d'inscription et pour protéger les mdp des users j'ai utilisé le passhash préconisé par php. Cela fonctionne bien et mes données sont bien enregistrés dans la bdd et crypté.

Le problème c'est la page de connexion du user je n'arrive pas à vérifier le mdp, quand je teste il me dit que le mdp n'est pas correcte ou alors j'ai une erreur, j'ai essayé plusieurs code mais je ne trouve pas la solution.

Si quelqu'un pouvez me dire ce qui ne vas ce serait sympa.

Voici un bout de code de ma page d’inscription:
if(isset($_POST['forminscription'])) {
   $pseudo = htmlspecialchars($_POST['pseudo']);
   $mail = htmlspecialchars($_POST['mail']);
   $mail2 = htmlspecialchars($_POST['mail2']);
  

 $user_pwd = 'mdp';

$password_encrypted = password_hash($user_pwd, PASSWORD_BCRYPT); 


   if(!empty($_POST['pseudo']) AND !empty($_POST['mail']) AND !empty($_POST['mail2']) AND !empty($_POST['mdp'])) {
      $pseudolength = strlen($pseudo);
      if($pseudolength <= 50) {
         if($mail == $mail2) {
            if(filter_var($mail, FILTER_VALIDATE_EMAIL)) {
               $reqmail = $bdd->prepare("SELECT * FROM membres WHERE mail = ?");
               $reqmail->execute(array($mail));
               $mailexist = $reqmail->rowCount();
               if($mailexist == 0) {
                  
                     $insertmbr = $bdd->prepare("INSERT INTO membres (pseudo, mail, mdp) VALUES(?, ?, ?)");
                     $insertmbr->execute(array($pseudo, $mail, $password_encrypted));
                     $erreur = "Votre compte a bien été créé ! <a href=\"connexion.php\">Me connecter</a>";
                  } 
               } else {
                  $erreur = "Adresse mail déjà utilisée !";
               }
            } else {
               $erreur = "Votre adresse mail n'est pas valide !";
            }
         } else {
            $erreur = "Vos adresses mail ne correspondent pas !";
         }
      } else {
         $erreur = "Votre pseudo ne doit pas dépasser 255 caractères !";
      }
   } else {
      $erreur = "Tous les champs doivent être complétés !";
   }

?>





et la page de connexion:
if(isset($_POST['connexion'])) {
   $mail = htmlspecialchars($_POST['mail']);
   $user_pwd = 'mdp';}
if(!empty($mail) AND !empty($pass))

if $chk_email = $bdd->prepare("SELECT mdp FROM membres WHERE mail = ?"); 
$chk_email -> execute(array($mail)); 
$row = $chk_email->fetch(PDO::FETCH_ASSOC){ 
    $chk_pass = $row['mdp']; //inside a while loop to get the password 
    $pass_isGood = $bcrypt->verify($password_encrypted, $chk_pass); )

if ($pass_isGood){
    echo 'le mot de passe est correcte';}
else{
  echo 'incorrecte!'
}
     
?>

   <section>
      <div align="center">
         <h2>Connexion</h2>
         <br /><br />
         <form method="POST" action="">
            <input type="varchar" name="mail" placeholder="mail" />
            <input type="text" name="mdp" placeholder="mdp" />
            <br /><br />
            <input type="submit" name="connexion" value="Se connecter !" />
         </form>

         <?php
         if(isset($erreur)) {
            echo '<font color="red">'.$erreur."</font>";
         }
         ?>


EDIT : Ajout des balises de code
EDIT²: Déplacement dans le forum PHP
A voir également:

1 réponse

jordane45 Messages postés 38458 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 avril 2025 4 740
19 août 2020 à 13:10
Bonjour,

Plusieurs choses..
Déjà, htmlspecialchars ... ne s'utilise que pour l'affichage... en aucun cas pour faire l'insertion en bdd ...

Ensuite, tu ne récupère pas le contenu du champ mdp de ton $_POST
remplace
if(isset($_POST['connexion'])) {
   $mail = htmlspecialchars($_POST['mail']);
   $user_pwd = 'mdp';}

par
if(isset($_POST['connexion'])) {
   $mail = !empty($_POST['mail']) ? $_POST['mail'] : NULL;
   $user_pwd = !empty($_POST['mdp']) ? $_POST['mdp'] : NULL;
}


et enfin, le pendant de password_hash ... c'est password_verify

Essaye donc
 $chk_pass = $row['mdp']; //inside a while loop to get the password 
    $pass_isGood = password_verify($password_encrypted, $chk_pass); )


je t'invite également à lire et à appliquer les conseils donnés ici :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code


NB: A l'avenir, pour poster du code sur le forum, merci d'utiliser les BALISES DE CODE.
Explications ( à lire ENTIEREMENT !! ) disponibles ici :
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

.


1