Connection avec mot de pass hashé
Ibilolz
Messages postés
130
Date d'inscription
Statut
Membre
Dernière intervention
-
Pitet Messages postés 2826 Date d'inscription Statut Membre Dernière intervention -
Pitet Messages postés 2826 Date d'inscription Statut Membre Dernière intervention -
Bonjour, j'ai codé un petit formulaire pour permettre à l'administrateur d'ajouter des gens au site.
J'ai donc hasher le mdp avec la fonction crypt()
Il se rentre bien dans ma BD hashé. Cependant je n'arrive pas à ma connecter avec les comptes. J'ai du me tromper quand j'ai rajouter la condition du hashage dans le code de ma connection. Voici le code :
j'ai essayé de faire de deux façons :
1)
marche pas.
2)
marche pas.
J'ai donc hasher le mdp avec la fonction crypt()
<FORM Method="POST" Action=""> Prénom : <input type="text" name="pre" size=10 <br></br> Nom : <input type="text" name="nom" size=20 <br></br> Date de naissance :<input type="text" name="date" size=20 <br></br> Login :<input type="text" name="login" size=20 <br></br> Mdp :<input type="text" name="mdp" size=20 <br></br> <br></br> <input type="submit", name="submit" Value="Ajouter"> <?php include 'fonctions.connect.php'; if ($_POST['pre']!='' && $_POST['nom']!='' && $_POST['date']!=''&& $_POST['login']!=''&& $_POST['mdp']!='') { $pre = mysql_real_escape_string($_POST['pre']); $nom = mysql_real_escape_string($_POST['nom']); $date = mysql_real_escape_string($_POST['date']); $login = mysql_real_escape_string($_POST['login']); $mdp = mysql_real_escape_string($_POST['mdp']); $hash = (crypt($mdp)); $sql = "INSERT INTO users (prenom,nom,date_naissance,username,password) VALUES ('$pre','$nom','$date','$login','$hash')"; mysql_query($sql) or die(mysql_error()) ; }
Il se rentre bien dans ma BD hashé. Cependant je n'arrive pas à ma connecter avec les comptes. J'ai du me tromper quand j'ai rajouter la condition du hashage dans le code de ma connection. Voici le code :
<?php include('config2.php'); //Si lutilisateur est connecte, on le deconecte if(isset($_SESSION['username'])) { //On le deconecte en supprimant simplement les sessions username et userid unset($_SESSION['username'], $_SESSION['userid']); header("location: index.html" ); ?> <?php } else { $ousername = ''; //On verifie si le formulaire a ete envoye if(isset($_POST['username'], $_POST['password'])) { //On echappe les variables pour pouvoir les mettre dans des requetes SQL if(get_magic_quotes_gpc()) { $ousername = stripslashes($_POST['username']); $username = mysql_real_escape_string(stripslashes($_POST['username'])); $password = stripslashes($_POST['password']); } else { $username = mysql_real_escape_string($_POST['username']); $password = $_POST['password']; } //On recupere le mot de passe de lutilisateur $req = mysql_query('select password,id,rang from users where username="'.$username.'"'); $dn = mysql_fetch_array($req); //On le compare a celui quil a entre et on verifie si le membre existe if($dn['password']==$password and mysql_num_rows($req)>0) { //Si le mot de passe es bon, on ne vas pas afficher le formulaire $form = false; //On enregistre son pseudo dans la session username et son identifiant dans la session userid $_SESSION['username'] = $_POST['username']; $_SESSION['userid'] = $dn['id']; $_SESSION['rang'] = $dn['rang']; if(isset($_SESSION['rang'])) { if($_SESSION['rang']==1) header('location:index2.php'); else header('location:index3.php'); } } else { //Sinon, on indique que la combinaison nest pas bonne echo 'La combinaison n\'est pas bonne.'; } } else { } } ?>
j'ai essayé de faire de deux façons :
1)
$password2 = stripslashes($_POST['password']); $password = (crypt($password2)); } else { $username = mysql_real_escape_string($_POST['username']); $password2 = $_POST['password']; $password = (crypt($password2));
marche pas.
2)
if($dn['password']==(crypt($password)) and mysql_num_rows($req)>0)
marche pas.
A voir également:
- Connection avec mot de pass hashé
- Trousseau mot de passe iphone - Guide
- Mot de passe - Guide
- Mot de passe administrateur - Guide
- Mot de passe bios perdu - Guide
- Voir mot de passe wifi android - Guide
2 réponses
Salut,
Premièrement il semble que tu ai une faute de frappe sur cette ligne :
$ousername à la place de $username
Aucun intérêt à utiliser la fonction stripslashes sur tes données avant les utiliser en sql. Pour échapper la caractères spéciaux avant d'utiliser tes données en sql, il faut uniquement utiliser mysql_real_escape_string(). Utilise stripslashes (ou htmlentities) uniquement lors de l'affichage html.
Enfin, pour vérifier ton mot de passe hashé en bdd avec celui saisie par l'utilisateur, tu peux faire la comparaison directement dans ta requête :
Si ta requête te retourne un résultat : le login et le password sont correct. Si la requête ne te retourne aucun résultat, le couple login/password n'est pas correct.
Bonne journée
PS : comme d'habitude, on déconseille d'utiliser la vieille et obsolète extension Mysql en php (fonction mysql_*). Préfère PDO ou Mysqli ;)
Premièrement il semble que tu ai une faute de frappe sur cette ligne :
$ousername = stripslashes($_POST['username']);
$ousername à la place de $username
Aucun intérêt à utiliser la fonction stripslashes sur tes données avant les utiliser en sql. Pour échapper la caractères spéciaux avant d'utiliser tes données en sql, il faut uniquement utiliser mysql_real_escape_string(). Utilise stripslashes (ou htmlentities) uniquement lors de l'affichage html.
Enfin, pour vérifier ton mot de passe hashé en bdd avec celui saisie par l'utilisateur, tu peux faire la comparaison directement dans ta requête :
// pas de stripslashes avant le traitement sql ! $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string(crypt($_POST['password'])); $req = mysql_query('select id, rang from users where username="'.$username.'" AND password="' . $password . '"');
Si ta requête te retourne un résultat : le login et le password sont correct. Si la requête ne te retourne aucun résultat, le couple login/password n'est pas correct.
Bonne journée
PS : comme d'habitude, on déconseille d'utiliser la vieille et obsolète extension Mysql en php (fonction mysql_*). Préfère PDO ou Mysqli ;)
Bonsoir, j'ai donc suivi vos conseils :
Mais maintenant je n'arrive plus a me connecter, il ne reconnait pas les mdp hachés je pense du coup pour lui le couple est incorrect
<?php include('config2.php'); //Si lutilisateur est connecte, on le deconecte if(isset($_SESSION['username'])) { //On le deconecte en supprimant simplement les sessions username et userid unset($_SESSION['username'], $_SESSION['userid']); header("location: index.html" ); ?> <?php } else { $username = ''; //On verifie si le formulaire a ete envoye if(isset($_POST['username'], $_POST['password'])) { $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string(crypt($_POST['password'])); } //On recupere le mot de passe de lutilisateur $req = mysql_query('select id, rang from users where username="'.$username.'" AND password="' . $password . '"'); $dn = mysql_fetch_array($req); //On le compare a celui quil a entre et on verifie si le membre existe if($dn['password']==$password and mysql_num_rows($req)>0) { //Si le mot de passe es bon, on ne vas pas afficher le formulaire $form = false; //On enregistre son pseudo dans la session username et son identifiant dans la session userid $_SESSION['username'] = $_POST['username']; $_SESSION['userid'] = $dn['id']; $_SESSION['rang'] = $dn['rang']; if(isset($_SESSION['rang'])) { if($_SESSION['rang']==1) header('location:index2.php'); else header('location:index3.php'); } } else { //Sinon, on indique que la combinaison nest pas bonne echo 'La combinaison n\'est pas bonne.'; header("location: index.html" ); } } ?>
Mais maintenant je n'arrive plus a me connecter, il ne reconnait pas les mdp hachés je pense du coup pour lui le couple est incorrect
Il faut que tu hash tes mots de passe à l'insertion en bdd (cf. ton premier message) de la même façon que tu as fait ici :
D'abord on hash, et ensuite on protège notre chaine pour l'utiliser dans une requête.
$hash = mysql_real_escape_string(crypt($_POST['mdp'])); $sql = "INSERT INTO users (prenom,nom,date_naissance,username,password) VALUES ('$pre','$nom','$date','$login','$hash')";
D'abord on hash, et ensuite on protège notre chaine pour l'utiliser dans une requête.
En fait ta condition
ne peut pas fonctionner car tu ne récupère pas le password dans ta requête, donc la variable $dn['password'] est nulle.
D'ailleurs tu n'as pas besoin de faire cette comparaison puisque tu l'as déjà faite dans ta requête. Tu as juste à vérifier si le nombre de ligne retournée par la requête est égal à 0 ou 1.
if($dn['password']==$password
ne peut pas fonctionner car tu ne récupère pas le password dans ta requête, donc la variable $dn['password'] est nulle.
D'ailleurs tu n'as pas besoin de faire cette comparaison puisque tu l'as déjà faite dans ta requête. Tu as juste à vérifier si le nombre de ligne retournée par la requête est égal à 0 ou 1.