[RESOLU] Login avec mot de "password_hash"

Eléphant du PHP | 55 Messages

04 mai 2021, 13:01

Bonjour,
J'ai créé un espace membre, ceci dit je souhaite que le mot de passe soit crypté, ça fonctionne bien ceci dit quand je rentre mes identifiants sur la page login, il ne reconnaît pas le mot de passe.
Une idée ?

Code : Tout sélectionner

<?php session_name('ALSH'); session_start(); $message = ''; $display = ''; require_once('include/connexion.php'); if(isset($_POST['login'])) { if(empty($_POST['nom']) || empty($_POST['prenom']) || empty($_POST['pseudo']) || empty($_POST['password'])) { $message = 'Tous les champs sont obligatoires'; } else { $sql_verif = "SELECT * FROM espace_membres WHERE pseudo = :pseudo"; $req_verif = $cnx->prepare($sql_verif); $req_verif->execute( array('pseudo' => $_POST['pseudo']) ); $count = $req_verif->rowCount(); if($count > 0) { $message = '<p class="erreur">Ce pseudo existe déjà !'; } else { $sql = "INSERT INTO espace_membres (nom, prenom, pseudo, password) VALUES (?,?,?,?)"; $rs_insert = $cnx->prepare($sql); $var_nom = $_POST['nom']; $var_prenom = $_POST['prenom']; $var_pseudo = $_POST['pseudo']; $var_password = password_hash($_POST['password'], PASSWORD_DEFAULT); $rs_insert->bindValue(1,$var_nom,PDO::PARAM_STR); $rs_insert->bindValue(2,$var_prenom,PDO::PARAM_STR); $rs_insert->bindValue(3,$var_pseudo,PDO::PARAM_STR); $rs_insert->bindValue(4,$var_password,PDO::PARAM_STR); $rs_insert->execute(); } } } ?>

Mammouth du PHP | 1766 Messages

04 mai 2021, 14:34

sans le code qui vérifie si le mot de passe est le bon, non, pas d'idée.

Eléphant du PHP | 55 Messages

04 mai 2021, 16:16

Désolé j'avais oublié
donc la page login :

Code : Tout sélectionner

<?php session_name( 'ALSH' ); session_start(); $message = ''; require_once('include/connexion.php'); if(isset($_POST['login'])) { if(empty($_POST['pseudo']) || empty($_POST['password'])) { $message = 'Merci de remplir les champs du formulaire'; } else { $sql = "SELECT * FROM espace_membres WHERE pseudo=:pseudo AND password=:password"; $req = $cnx->prepare($sql); $req->execute( array('pseudo' => $_POST['pseudo'], 'password' => (password_verify($_POST['password'])))); $count = $req->rowcount(); if($count > 0) { $_SESSION['pseudo'] = $_POST['pseudo']; $donnees = $req->fetch(PDO::FETCH_ASSOC); $_SESSION['id'] = $donnees['id']; header('location:form1.php'); } else { $message = '<p class="erreur">Accès refusé !</p>'; } } } ?>

Mammouth du PHP | 1766 Messages

04 mai 2021, 16:23

que se passe-t-il quand php est configuré pour afficher les erreurs ?

Avatar du membre
Mammouth du PHP | 1382 Messages

04 mai 2021, 16:30

Salut, tu enregistres le mot de passe hashé dans la base de données puis tu fais une requête avec en valeur de password le résultat de password_verify qui est un booléen et en plus sans lui fournir le hash qui est un paramètre obligatoire. Ca ne peut donc pas marcher.

De plus le principe de la fonction password_hash est de générer un hash différent à chaque fois qu'elle est appelée. Il faut rechercher l'utilisateur par le pseudo puis vérifier le mot de passe avec la fonction password_verify en lui fournissant le mot de passe saisi en clair et le hash enregistré dans la base de donneés.

https://www.php.net/manual/fr/function. ... verify.php
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Eléphant du PHP | 55 Messages

04 mai 2021, 17:56

C'est un peu compliqué, pouvez-vous m'aider à partir de mon code fourni ?

Eléphant du PHP | 55 Messages

05 mai 2021, 17:11

Bonjour,
Je n'y arrive toujours pas, je republie mon code si quelqu'un a une idée ça serait cool ! c'est la première fois que j'utilise password_hash et password_verify et c'est un peu hard

Page inscription :

Code : Tout sélectionner

<?php session_name('ALSH'); session_start(); $message = ''; $display = ''; require_once('include/admin/cnx.php'); if(isset($_POST['login'])) { if(empty($_POST['nom']) || empty($_POST['prenom']) || empty($_POST['pseudo']) || empty($_POST['password'])) { $message = 'Tous les champs sont obligatoires'; } else { $sql_verif = "SELECT * FROM espace_membres WHERE pseudo = :pseudo"; $req_verif = $cnx->prepare($sql_verif); $req_verif->execute( array('pseudo' => $_POST['pseudo']) ); $count = $req_verif->rowCount(); if($count > 0) { $message = '<p class="erreur">Ce pseudo existe déjà !'; } else { $sql = "INSERT INTO espace_membres (nom, prenom, pseudo, password, date) VALUES (?,?,?,?, CURDATE())"; $rs_insert = $cnx->prepare($sql); $var_nom = $_POST['nom']; $var_prenom = $_POST['prenom']; $var_pseudo = $_POST['pseudo']; $var_password = password_hash($_POST['password'], PASSWORD_DEFAULT); $rs_insert->bindValue(1,$var_nom,PDO::PARAM_STR); $rs_insert->bindValue(2,$var_prenom,PDO::PARAM_STR); $rs_insert->bindValue(3,$var_pseudo,PDO::PARAM_STR); $rs_insert->bindValue(4,$var_password,PDO::PARAM_STR); $rs_insert->execute(); $display = 'style="display:none"'; $message = '<h2 style="color:green">Félicitation</h2> <span style="color:green">Votre compte a bien été créé.</span><br /> <a href="login.php"><p>Accèdez à votre compte</a></p>'; } } } ?>
Page login :

Code : Tout sélectionner

<?php session_name( 'ALSH' ); session_start(); $message = ''; require_once('include/admin/cnx.php'); if(isset($_POST['login'])) { if(empty($_POST['pseudo']) || empty($_POST['password'])) { $message = 'Merci de remplir les champs du formulaire'; } else { $sql = "SELECT * FROM espace_membres WHERE pseudo = :pseudo AND password = :password"; $req = $cnx->prepare($sql); $req->execute( array('pseudo' => $_POST['pseudo'], 'password' => $_POST['password']) ); $count = $req->rowcount(); if($count > 0) { $_SESSION['pseudo'] = $_POST['pseudo']; $_POST['password'] = $hashed_password; $donnee = $req->fetch(PDO::FETCH_ASSOC); $_SESSION['id'] = $donnee['id']; if(password_verify($_SESSION['password'], $donnee['password'])) { header('location:form1.php'); } } else { $message = '<p class="erreur">Accès refusé !</p>'; } } } ?>

Eléphant du PHP | 55 Messages

06 mai 2021, 16:07

C'est bizarre quand j'interroge ma requête je n'ai aucun retour,

Avatar du membre
Mammouth du PHP | 1382 Messages

06 mai 2021, 16:10

Tu ne dois pas utiliser le password dans la requête select puisque tu as hashé le password avant de l'insérer en base.
Il faut rechercher l'utilisateur par le pseudo puis vérifier le mot de passe avec la fonction password_verify en lui fournissant le mot de passe saisi en clair et le hash enregistré dans la base de donneés.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Eléphant du PHP | 55 Messages

06 mai 2021, 16:24

salut Saian, merci pour ta réponse.
Je n'utilise peut-être pas convenablement la fonction password_verfy var rien ne fonctionne :

Code : Tout sélectionner

<?php session_name( 'ALSH' ); session_start(); $message = ''; require_once( 'include/admin/cnx.php' ); if ( isset( $_POST[ 'login' ] ) ) { if ( empty( $_POST[ 'pseudo' ] ) || empty( $_POST[ 'password' ] ) ) { $message = '<p class="erreur">Merci de remplir les champs du formulaire</p>'; } else { $sql = "SELECT * FROM espace_membres WHERE pseudo=:pseudo AND password=:password"; $req = $cnx->prepare( $sql ); $req->execute( array( 'pseudo' => $_POST[ 'pseudo' ], 'password' => $_POST[ 'password' ] ) ); $count = $req->rowcount(); if ( $count > 0 ) { $_SESSION[ 'pseudo' ] = $_POST[ 'pseudo' ]; $donnee = $req->fetch( PDO::FETCH_ASSOC ); $_SESSION[ 'id' ] = $donnee[ 'id' ]; $hash = $donnee[ 'id' ]; if (password_verify($_POST[ 'password' ], $hash)) { header( 'location:form1.php' ); } } else { $message = '<p class="erreur">Accès refusé !</p>'; } } } ?>

Avatar du membre
Mammouth du PHP | 1382 Messages

06 mai 2021, 17:17

Tu ne dois pas utiliser le password dans la requête select
C'est pourtant clair non ?
// select sur le pseudo SANS le password
// parcours des résultats dans une variable $donnee comme dans ton code (donc un while $donne = "fetch" à moins que le pseudo soit unique et dans ce cas un seul fetch suffit)
// pour chaque résultat on vérifie
if (password_verify($_POST['password'], $donnee['password'])) {
  // utilisateur reconnu
}
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Eléphant du PHP | 55 Messages

06 mai 2021, 18:23

Oui ça j'ai bien compris, ceci-dit ça ne donne rien, j'ai essayé un echo $donnee['pseudo] pour voir et je me rends compte qu'il ne retourne aucune résultat.

Avatar du membre
Mammouth du PHP | 1382 Messages

06 mai 2021, 18:30

Apparemment non tu n'as pas compris puisque tu as toujours le password dans le where du select...
$sql = "SELECT * FROM espace_membres WHERE pseudo=:pseudo AND password=:password";
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Eléphant du PHP | 55 Messages

06 mai 2021, 19:01

Non je l'ai enlevé lol

Code : Tout sélectionner

$sql = "SELECT * FROM espace_membres WHERE pseudo=?";

Avatar du membre
Mammouth du PHP | 1382 Messages

06 mai 2021, 20:00

Oui et du coup tu as essayé quoi ?
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^