vérifier un mot de passe dans la bdd avec password_verify
toute fois que je veux me connecter le mot de passe ne correspond pas et j'ai toujours ce message d'erreur
première
Notice: Trying to get property of non-object in C:\wamp\www\institut\pages_interface\Registre.php on line 44
DEUXIEME:
Notice: Undefined property: PDOStatement::$mdp in C:\wamp\www\institut\pages_interface\Registre.php on line 45
voici mon code :
if(!empty($_POST)){
$user ="";
$erreurs = array();
include_once '../inc/bdConnect.php';
include_once '../fonction/CreerFunction.php';
if(empty($_POST['nom'])){
$erreurs['nom']= "veuilez entrez votre nom";
} else {
$req = $bdd ->prepare('SELECT id FROM etudiant WHERE nom = ?');
$req ->execute([$_POST['nom']]);
$user = $req->fetch();
if($user){
//$erreurs['nom'] ="Ce nom exixte";
}elseif ($user != $_POST['nom']) {
$erreurs['nom'] ="Votre nom n'est pas le même veillez revérifier";
}
}
if(empty($_POST['prenom'])){
$erreurs['prenom']="Veuilez entrez votre prénom";
}else {
$req = $bdd ->prepare('SELECT id FROM etudiant WHERE prenom = ?');
$req ->execute([$_POST['prenom']]);
$user = $req->fetch();
if($user){
// $erreurs['prenom'] ="Votre Prenom n'est pas le même veillez revérifier";
}elseif ($user != $_POST['prenom']) {
$erreurs['prenom'] ="Votre Prenom n'est pas le même veillez revérifier";
}
}
if(empty($_POST['mdp'])){
$erreurs['mdp']="Entrer votre mot de passe";
}else {
$req = $bdd ->prepare('SELECT id FROM etudiant WHERE mdp =?');
$req ->execute([$_POST['mdp']]);
$user = $req->fetch();
show_erreur($_POST['mdp']);
show_erreur($user->mdp); // cause problème ligne 44
if(password_verify($_POST['mdp'],$req->mdp)){//ligne 45
exit();
}
else {
$erreurs['mdp'] ="Votre mot de passe n'est pas le même veillez revérifier";
}
}
if(empty($erreurs)){
session_start();
$_SESSION['nom'] = $_POST['nom'];
header('location:PageMembre.php');
}//var_dump($erreurs);
show_erreur($erreurs);
}
?>
Réponses apportées à cette discussion
Salut,
je m'interroge sur cette manière d'identifier un utilisateur en effectuant trois requêtes successives.
Et ce sont surtout les deux premières requêtes qui me semblent pour le moins curieuses : pourquoi donc effectuer d'abord une recherche sur le nom, ensuite une autre sur le prénom et enfin une troisième sur le mot de passe au lieu de ne faire qu'une seule requête qui vérifie les trois en même temps.
On peut en effet considérer la possibilité de plus d'un utilisateur portant le nom vérifier, la même chose pour le prénom. Ce qui en principe distingue chaque utilisateur de façon unique, c'est son mot de passe. Donc il n'est pas cohérent de diviser la vérification en trois requêtes successives les deux premières ne servant pas à grand chose.
Sur la requête sur le mot de passe, ça semble indiquer que les mots de passe sont enregistrés dans la base de donnée en clair et non hachés ou chiffrés... coté sécurité, c'est assez mauvais.
Quant aux erreurs :
- celle de la ligne 44 pourrait indiquer une erreur d'exécution dans la requête et MySQL aurait retourné une erreur et non un résultat attendu, même vide;
- celle de la ligne 45, elle est tout à fait possible si la requête retourne un résultat vide parce qu'aucune correspondance n'a été trouvée.
Suggestion : tester d'abord les requêtes manuellement dans MySQL via phpMyAdmin ou encore dans le client MySQL en ligne de commande pour vérifier ce qui est retourné. Une fois que les résultats obtenus sont satisfaisants, alors les formater en requêtes préparées dans le code.
Petite astuce : activer les logs de requêtes MySQL et vérifier quelles requêtes sont effectivement exécutées lorsque ce script est appelé.
Bonjour Cyrano j'ai lu ta remarque, elles sont pertinentes... j'ai pu faire la vérification en une seule fois comme tu me l'as conseillé je placerais le code ici, cependant en ce qui concerne le mot de passe il n'est pas en claire dans le bdd il est crypté, avec password_hash().
voici mon fichoer RegistreEleve.php
if(!empty($_POST)){
$erreurs = array();
include_once '../inc/bdConnect.php';
if(empty($_POST['pseudo'])){
$erreurs['pseudo']= "veuilez entrez votre nom";
} else {
$req = $bdd ->prepare('SELECT id FROM etudiant WHERE pseudo = ?');
$req ->execute([$_POST['pseudo']]);
$user = $req->fetch();
if($user){
$erreurs['pseudo'] ="Le pseudo est déjà utilisé";
}
}
if(empty($_POST['nom'])){
$erreurs['nom']="Veuilez correctement entrez votre nom";
}
if(empty($_POST['prenom'])){
$erreurs['prenom']="veuilez entrez Correctement votre prénom";
}
if(empty($_POST['mdp'])){
$erreurs['mdp']="Le champ n'a pas été rempli";
} elseif($_POST['mdp']!= $_POST['mdp2']){
$erreurs['mdp']="Les mots de pass ne sont pas identiques";
}
if(empty($erreurs)){
$req = $bdd ->prepare('INSERT INTO etudiant(pseudo,nom,prenom,mdp)VALUES(:pseudo,:nom,:prenom,:mdp)');
$mdp = password_hash($_POST['mdp'], PASSWORD_BCRYPT);
$req->execute(array(
'pseudo' =>$_POST['pseudo'],
'nom' =>$_POST['nom'],
'prenom' =>$_POST['prenom'],
'mdp' =>$mdp));
header('location:Registre.php');// page de connexion
}
var_dump($erreurs);
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="http://localhost/gestion_eleve/css/css1.css" />
</head>
<body>
<form method="POST" action="RegistreEleve.php">
<fieldset>
<h3>CONNEXION</h3>
<table>
<tr>
<td>
Pseudonyme
</td>
<td>
<input type="text" name="pseudo" id="co">
</td>
<tr>
<td>
Nom
</td>
<td>
<input type="text" name="nom" id="co">
</td>
</tr>
<tr>
<td>
Prénom
</td>
<td>
<input type="text" name="prenom" id="co">
</td>
</tr>
<tr>
<!--<td>
Description
</td>
<td>
<textarea name="Description" id="descrip" rows="4" cols=""></textarea>
</td>
</tr>-->
<tr>
<tr>
<td>
<label>Mot de pass</label>
</td>
<td>
<input type="password" name="mdp" id="co">
</td>
</tr>
<tr>
<td>
Confirmer le passe
</td>
<td >
<input type="password" name="mdp2" id="co">
</td>
</tr>
</table>
</fieldset>
<p><input type="submit" name="ok" value="inscription" id="cor"><p>
</form>
</body>
</html>
ET voici le fichier Registre.php qui permettra de se connecter :
<?php
include_once '../fonction/CreerFunction.php';
if(!empty($_POST) && !empty($_POST['nom']) && !empty($_POST['prenom']) && !empty($_POST['mdp'])){
$erreurs = array();
include_once '../inc/bdConnect.php';
$req = $bdd ->prepare('SELECT * FROM etudiant WHERE nom =:nom and prenom = :prenom');//je sais si c'est juste
$req->execute(
array(
'nom'=>$_POST['nom'],
'prenom'=>$_POST['prenom']
));
$user = $req->fetch();
show_erreur($_POST['mdp']); // SA marche
show_erreur($user->mdp);// SA MARCHE AUSSI
if(password_verify($_POST['mdp'], $req->mdp)){ // voici la ligne qui bloque
exit();
}else {
$erreurs['mdp'] ="Votre mot de passe n'est pas le même veillez revérifier";
}
if(empty($erreurs)){
session_start();
$_SESSION['nom'] = $_POST['nom'];
header('location:PageMembre.php');
}//var_dump($erreurs);
show_erreur($erreurs);
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="http://localhost/gestion_eleve/css/css1.css" />
</head>
<body>
<form method="POST" action="Registre.php">
<fieldset>
<h3>CONNEXION</h3>
<table>
<tr>
<td>
Nom
</td>
<td>
<input type="text" name="nom" id="co">
</td>
</tr>
<tr>
<td>
Prénom
</td>
<td>
<input type="text" name="prenom" id="co">
</td>
</tr>
<tr>
<!--<td>
Description
</td>
<td>
<textarea name="Description" id="descrip" rows="4" cols=""></textarea>
</td>
</tr>-->
<tr>
<tr>
<td>
<label>Mot de pass</label>
</td>
<td>
<input type="password" name="mdp" id="co">
</td>
</tr>
</table>
</fieldset>
<p><input type="submit" name="ok" value="Connexion" id="cor"><p>
</form>
</body>
</html>
je ne fait que débuter en php , je suis pas encore un ace...
voici l'erreur qui est renvoyé :
Notice: Undefined property: PDOStatement::$mdp in C:\wamp\www\institut\pages_interface\Registre.php on line 16
Peut-être que remplacer
if(password_verify($_POST['mdp'], $req->mdp))
par
if(password_verify($_POST['mdp'], $user->mdp))
fonctionnerait mieux, non ?
J'ajoute quand même qu'appeler exit() en cas d'erreur n'est pas la manière la plus conviviale pour l'utilisateur qui devra alors recharger la page pour afficher à nouveau le formulaire de connexion.
Autre point : dans le formulaire, les champs nom et prenom on le même attribut id="co", ce qui est d'abord une erreur et ensuite peut générer des erreurs dans certains cas.