[RESOLU] retour du Hashe ne fonctionne pas.

Petit nouveau ! | 7 Messages

16 févr. 2023, 17:40

Bonjour,

pour sécuriser le MdP, j'ai choisi ceci (password_hash($mot_de_passe, PASSWORD_DEFAULT)), le mot de passe se hashe bien dans ma BDD.
Par contre, lorsque je veux loguer, il ne se passe rien.
Je sais que cela provient de la variable $mot_de_passe qui se trouve dans cette ligne password_verify($passe, $mot_de_passe ).
apparemment elle serait vide, donc par de vérification entre la BDD et celle de l'utilisateur.
Il manquerait une authentification de la variable.
Mais là, je suis perdu.
Quelqu'un peut il m'aider?

Grand merci d'avance


code pour se loguer

<?php
session_start();
@$mot_de_passe = $_POST["mot_de_passe"];
@$echelon = $_POST["echelon"];
@$passe = $_POST["passe"];
@$valider = $_POST["valider"];
$erreur = "";
if (isset($valider)) {
include("connexion.php");
$sel = $pdo->prepare('select * from admistration where echelon=? and mot_de_passe=? limit 1');
$sel->execute(array($echelon, $mot_de_passe));
$tab = $sel->fetchAll();

if (count($tab) > 0) {
if (password_verify($passe, $mot_de_passe)) // Vérification du mot de passe

$_SESSION["echelonPrenom"] = ucfirst(strtolower($tab[0]["echelon"])) .
" " . strtoupper($tab[0]["prenom"]);
$_SESSION["autoriser"] = "oui";
header("location:choixAdmin.php");
} else
$erreur = "Mauvais login ou mot de passe!";
}
?>
<?php echo $echelon;
echo $passe;
echo $mot_de_passe;

?>

Avatar du membre
Mammouth du PHP | 1609 Messages

16 févr. 2023, 18:00

Salut jojo,

Comment utiliser password_hash et password_verify.

Lors de la création du compte, il faut enregistrer le hash retourné par password_hash dans le compte. C'est le seul moment où on utilise password_hash (hors modification du mot de passe).

Lors d'une tentative de connexion, il faut chercher la ligne du compte via son identifiant (pseudo, email, etc, selon le cas). Rien d'autre, pas de mot de passe en clair ou de mot de passe hashé.
Une fois la ligne trouvée, on vérifie la validité du mot de passe fourni en le comparant au hash enregistré grâce à la fonction password_verify.

password_verify ( mot de passe transmis via le formulaire de connexion , hash du mot de passe enregistré dans le compte )
Développeur web depuis + de 20 ans

Petit nouveau ! | 7 Messages

16 févr. 2023, 19:10

Merci du retour Saian ;

Mais ce que tu m'expliques, c'est ce que je fais.
Là je viens de m'apercevoir qu'il y avait ça en trop @$mot_de_passe = $_POST["mot_de_passe"]; parce qu’il y a ça tout en bas echo $mot_de_passe;. (supprimé aussi).
Si tu regardes mon algorithme, identifiant=echelon et je fourni le passe. Mais $mot_de_passe reste muet, comment puis le faire parler? Comment faire pour qu'il soit authentifié?
ou bien je suis à coté de la plaque et je ne comprends ce que tu veux m'expliquer (dsl)

Cordialement

Avatar du membre
Mammouth du PHP | 1609 Messages

16 févr. 2023, 19:39

Non ce code ne fait pas ce que j'explique.

La requête : select * from admistration where echelon=? and mot_de_passe=? limit 1
Lors d'une tentative de connexion, il faut chercher la ligne du compte via son identifiant (pseudo, email, etc, selon le cas). Rien d'autre, pas de mot de passe en clair ou de mot de passe hashé.
Développeur web depuis + de 20 ans

Petit nouveau ! | 7 Messages

16 févr. 2023, 20:16

ok; ce que tu veux me dire c'est, j’ôte mot_de_passe=? pour ne chercher que l'identifiant, donc il me reste ça select * from admistration where echelon=? limit 1.
en même temps il faut que je supprime celui de cette ligne, $sel->execute(array($echelon,$mot_de_passe)); sinon j'ai une erreur de variable non définie, ce qui me donne
$sel->execute(array($echelon);

J'avais déjà essayé cette solution, ma page location:choixAdmin.php s'ouvre, c'est très bien et c'est le but désiré, mais même sans MDP, elle s'ouvre aussi, donc le hashe ne fonctionne pas non plus.
Franchement, j'ai essayé beaucoup de chose, et si je viens demander de l'aide c'est que mon cerveau va sortir de mon crane tellement il a emmagasiner de bêtises.
Au secoure s'il te plait, au secoure
Cordialement

Mammouth du PHP | 1967 Messages

17 févr. 2023, 10:42

Tu as corrigé ton code pour la 1ère partie expliquée par Saian

Mais il te reste à modifier la deuxième partie,
Récupère le hash depuis ta BDD et insère le dans password_verify
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Mammouth du PHP | 1609 Messages

17 févr. 2023, 12:47

<?php
session_start();

if (isset($_POST['valider'])) {
    $error = login($_POST['echelon'], $_POST['passe']);
    echo $error;
}

function login($login, $password) {
    require 'connexion.php';

    $statement = $pdo->prepare('select * from admistration where echelon=? limit 1');
    $statement->execute([$login]);
    $account = $statement->fetch();

    if (false === $account) {
        return 'Compte inconnu.';
    }

    if (false === password_verify($password, $account['mot_de_passe'])) {
        return 'Mot de passe non valide.';
    }

    $_SESSION['echelonPrenom'] = ucfirst(strtolower($account['echelon'])) . ' ' . strtoupper($account['prenom']);
    $_SESSION['autoriser'] = true;

    header('location: choixAdmin.php');
    exit;
}

Développeur web depuis + de 20 ans

Petit nouveau ! | 7 Messages

17 févr. 2023, 15:17

bonjour les Gens!

Merci Saian, ça fonctionne enfin, mais je vais comme même travailler sur le code pour que je puisse le comprendre et de de se fait voir ce qu'il ne va pas sur le mien, ou voir les défauts.
Merci beaucoup...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 févr. 2023, 16:32

Un conseil, commence par retirer de ton code tous les @
Le @ sert à masquer les erreurs (mais sans les corriger) donc c'est une erreur de les utiliser car cela gène le debugage en cas de problème :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 7 Messages

18 févr. 2023, 15:17

Ok, merci du conseil. ;)