impossible de connecter un utilisateur à partir des données suivantes
Table : Champ1 : Utilisateur : Pierre (255) Password : toto (255)
Les variables $_POST passent bien.
Le hash est bien stocké dans la bdd
Ca en marchait pas avec juste la fonction password_verify, et j'ai ajouté sur le code suivant la fonction password_need_rehash, et ça ne fonctionne toujours pas....
La fonction password_verify ne fonctionne pas.... Je ne sais plus quoi faire... une idée ?
<?
include "config.inc.php";
$lg = $_POST["login"];
$psswrd = $_POST["password"];
$verifexist = mysqli_query ($conn,"select* from ALSH_user where username='$lg'");
$userexist = mysqli_num_rows($verifexist);
if ($userexist==0)
{
$message = "<p>Utilisateur inconnu</p><p><a href=\"login.php\">Essayer encore</a></p>";
}
else
{
while ($testpass=mysqli_fetch_object($verifexist))
{
$verifpass = $testpass->password;
$idunique = $testpass->uniqid;
}
$new = [
'algo' => PASSWORD_DEFAULT,
'hash' => null
];
if (true === password_verify($psswrd,$verifpass))
{
if (true === password_needs_rehash($verifpass, $new['algo'], $new['options'])) {
$newHash = password_hash($psswrd, $new['algo']);
echo "<p> Nouveau hash : $newHash</p>";
setcookie('username',$lg,time() + 3600);
setcookie('id',$idunique,time() + 3600);
$message ="<p>Bonjour $lg. Vous êtes bien connecté ! Redirection en cours</p><h2><a href=\"index.php\">Accès à la plate-forme</a></h2>";
}
}
else
{
$message ="<p>Bonjour $lg. Il semblerait que ce ne soit pas le bon mot de passe !</p><p><a href=\"login.php\">Réessayer</a></p>";
}
}
?>
- Edité par GuilhemMercier 8 décembre 2024 à 19:39:04
Il n'y a pas le moindre test, même pas le minimum syndical (isset), dessus donc je ne sais pas comment tu peux l'affirmer.
> j'ai ajouté sur le code suivant la fonction password_need_rehash
Est-ce que tu sais au moins quel est son but ? Parce que ça n'apportera rien par rapport à ton problème. De plus, il ne sert à rien, tu ne fais pas d'UPDATE pour mettre à jour le hash, tu es juste en train de faire travailler le CPU pour rien.
> password-verify chez ovh
Parce qu'en local ou autre environnement de développement ça fonctionne ?
> La fonction password_verify ne fonctionne pas....
Justement, le problème est peut être au moment du password_hash
Tu as une injection SQL
Tu n'as pas besoin d'une boucle (while), tu es censé avoir au plus une ligne
Quand vous postez du code, vous pourriez au moins l'indenter correctement qu'on ne galère pas inutilement pour relire votre code ...
Tu affiches "redirection en cours" mais il n'y a aucun code pour la réaliser
Comment tu veux être "connecté" si tu n'utilises pas de session ?
EDIT : en fait c'est juste password_needs_rehash qui n'est pas compris/mal utilisé ? Le corps du if correspondant devrait se trouver après/au niveau de celui-ci du password_verify ?
Ce n'est pas que tu peux, c'est que tu devrais, ne serait-ce que par principe déjà (ne jamais faire confiance à l'utilisateur) + éventuellement les robots qui pourraient te pourrir tes logs.
> Cependant, je me suis demandé si OVH ne devait pas être configuré ?
Non :
l'extension ne serait pas supportée/active, ça planterait en erreur fatale (call to undefined function ou similaire sur toutes les fonctions password_*)
$2y$ c'est du bcrypt, ça ne nécessite pas de bibliothèque/est toujours actif (contrairement à argon2)
> cela fonctionne sans souci
Sauf si $password vaut null au password_hash et on ne peut pas le vérifier vu que le hash nous est donné sous forme d'image au lieu de texte. On n'a pas le code [de création du compte + formulaire] avec le password_hash non plus.
Il y a toujours l'injection SQL : prépare la requête !
$userexist = mysqli_num_rows($verifexist);
//verification de l'existence de l'utilisateur, ok
if ($userexist==0)
{
$message = "<p>Utilisateur inconnu</p><p><a href="%5C">Essayer encore</a></p>";
}
else
{
//recup du mot dez passe haché dans la base
while ($testpass=mysqli_fetch_assoc($verifexist))
{
$verifpass = $testpass["password"]; // ici je recup le password hashé
}
Se réécrit plus proprement :
if ($user = mysqli_fetch_assoc($verifexist)) {
if (password_verify($psswrd, $user['password'])) {
echo "Bonjour ", htmlspecialchars($user['username']), " Vous êtes bien connecté !"; # echo et session = ce n'est pas censé fonctionner/mauvaise idée
} else {
echo "Mot de passe erroné";
}
} else {
$message = "Utilisateur inconnu";
}
Voir même normalement :
if (($user = mysqli_fetch_assoc($verifexist)) && password_verify($psswrd, $user['password'])) {
echo "Bonjour ", htmlspecialchars($user['username']), " Vous êtes bien connecté !"; # echo et session = ce n'est pas censé fonctionner/mauvaise idée
} else {
$message = "Utilisateur inconnu ou mot de passe erroné";
}
> cela fonctionne, j'avais un stripslashes ....
Je ne vois pas comment un stripslashes pouvait altérer le mot de passe "toto" :roll:
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli