Connection avec mot de pass hashé

Fermé
Ibilolz Messages postés 131 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023 - Modifié par Ibilolz le 14/05/2014 à 13:00
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 16 mai 2014 à 09:09
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()


 <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.

2 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
Modifié par Pitet le 14/05/2014 à 15:16
Salut,

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 ;)
0
Ibilolz Messages postés 131 Date d'inscription mardi 1 avril 2014 Statut Membre Dernière intervention 26 juin 2023
14 mai 2014 à 20:12
Bonsoir, j'ai donc suivi vos conseils :

<?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
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
15 mai 2014 à 23:19
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 :
$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.
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
16 mai 2014 à 09:09
En fait ta condition
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.
0