IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

comparaison de deux mots de passe


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 47
    Points
    47
    Par défaut comparaison de deux mots de passe
    salut, Je suis Samgi, jaimerais que quelqu'un me vienne en aide s'il vous plait.
    voici mon problem:
    j'ai créé un formulaire d'inscription pour un site web et j'ai crypté le mot passe avec password_hash, ça fonctionne normalement parceque les donnees sont enregistré dans la base comme je voulais et le mot de passe est vraiment crypté. cependant, personne ne peut pas connecté a la base apres son inscription parce que je ne sais pas comment pouvoir recuperer le mot de passe crypter en php/mysqli par le biais de mon formulair de connenxion.

    est-ce que quelqu'un puisse m'aider svp en me disant comment recuperer le champ mot de passe crypter?
    voici mes codes;

    code de traitement du formulaire d'inscription:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
        session_start();
    	$error='';
        include 'database.php';
        if(isset($_REQUEST['submit'])){
            $user_firstname=$_REQUEST['fname'];
            $user_lastname=$_REQUEST['lname'];
            $user_username=$_REQUEST['username'];
            $user_email=$_REQUEST['email'];
            $user_password=$_REQUEST['password'];
    		$user_confpass=$_REQUEST['confpass'];
    //On vérifie que password et password2 sont identiques
    		if($_POST["password"] == $_POST["confpass"]){
    //On utilise alors notre fonction password_hash :
    			$hash = password_hash($user_password, PASSWORD_DEFAULT);
    			// encore plus secure
    			//$hash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 10));
    			$sql="INSERT INTO user(fname,lname,username,email,password,confpass) VALUES('$user_firstname','$user_lastname','$user_username','$user_email','$hash','$hash')";
    			mysqli_query($database,$sql) or die(mysqli_error($database));
    			$_SESSION['login_user'] = $user_username;
    			header('Location: membre.php?login_user='.$user_username);
    		} else {
    			$error = "Les deux mots de passe ne sont pas identiques.";
    		}
        }
    ?>
    code de traitement du formulaire de connexion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php
    /*
    Page: login.php
    */
    	session_start(); // à mettre tout en haut du fichier .php, cette fonction propre à PHP servira à maintenir la $_SESSION
    	$error=''; // Variable To Store Error Message
    if(isset($_POST['submit'])) { // si le bouton "Connexion" est appuyé
        // on vérifie que le champ "username" n'est pas vide
        // empty vérifie à la fois si le champ est vide et si le champ existe belle et bien (is set)
        if(empty($_POST['username'])) {
            $error = "Le champ nom d'utilisateur est vide.";
        } else {
            // on vérifie maintenant si le champ "Mot de passe" n'est pas vide"
            if(empty($_POST['password'])) {
               $error = "Le champ Mot de passe est vide.";
            } else {
                // les champs sont bien posté et pas vide, on sécurise les données entrées par le membre:
                $username = htmlentities($_POST['username'], ENT_QUOTES, "utf-8"); // le htmlentities() passera les guillemets en entités HTML, ce qui empêchera les injections SQL
                $MotDePasse = htmlentities($_POST['password'], ENT_QUOTES, "utf-8");
                //on se connecte à la base de données:
                $mysqli = mysqli_connect("Serveur", "utilisateur", "motdepass", "ma base");
                //on vérifie que la connexion s'effectue correctement:
                if(!$mysqli){
                    $error = "Erreur de connexion à la base de données.";
                } else {
                    // on fait maintenant la requête dans la base de données pour rechercher si ces données existe et correspondent:
                    $Requete = mysqli_query($mysqli,"SELECT * FROM user WHERE username = '".$username."' AND password = '".$MotDePasse."'");
                    // si il y a un résultat, mysqli_num_rows() nous donnera alors 1
                    // si mysqli_num_rows() retourne 0 c'est qu'il a trouvé aucun résultat
                    if(mysqli_num_rows($Requete) == 0) {
                        $error = "Le nom d'utilisateur ou le mot de passe est incorrect, le compte n'a pas été trouvé.";
                    } else {
                        // on ouvre la session avec $_SESSION:
                        $_SESSION['login_user'] = $username; // la session peut être appelée différemment et son contenu aussi peut être autre chose que le username
    					header("location: membre.php"); // Redirecting To Other Page
     
                }
            }
        }
    }
    }
    ?>
    NB: je ne peux pas comparer le mot de passe entrer par l'utilisateur avec celui qui est chiffré dans la base. comment puis-je faire svp? le formulaire d'inscription marche correctement.

    j'ai essayé de cette façon mais ça ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    } else {
    //on se connecte à la base de données:
    $mysqli = mysqli_connect("Serveur", "utilisateur", "motdepass", "ma base");
     
    // les champs sont bien posté et pas vide, on sécurise les données entrées par le membre:
    $username = mysqli_real_escape_string($mysqli, $_POST['username']); 
    $hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
     
    //on vérifie que la connexion s'effectue correctement:
    if(!$mysqli){
    	$error = "Erreur de connexion à la base de données.";
    } else {
    	// on fait maintenant la requête dans la base de données pour rechercher si ces données existe et correspondent:
    	$Requete = mysqli_query($mysqli,"SELECT * FROM user WHERE username = '".$username."' AND password = '".$hash."'");
    je vous remercie à l'avance.

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    Je crois qu'il n'est pas possible de déchiffrer un mot de passe sur lequel on a utilisé un hash.
    Actuellement, tu compares le mot de passe que l'utilisateur rentre et qui est non chiffré à celui de ta base qui lui est chiffré.
    Ce qu'il faudrait que tu fasses, c'est hasher le mot de passe rentré par l'utilisateur à sa connexion, puis tu compares ce dernier à celui associé au nom de l'utilisateur dans la base.

    Je ne sais pas si c'est clair et juste.
    Sinon attends la réponse de quelqu'un de plus compétent que moi.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2010
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 144
    Points : 241
    Points
    241
    Par défaut
    En effet, tu dois comparer les deux passwords hashés pour savoir si il est valide ou non.

    Dans ton script de connexion, à la ligne 27 de ce que tu as copié dans ton post, il faut remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    password_hash($MotDePasse)

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Il faut utiliser password_verify pour contrôler un hash créé par password_hash. C'est le seul moyen sûr pour vérifier le mot de passe.

    Edit: et surtout il ne faut pas réutiliser password_hash pour vérifier le mot de passe, car le résultat de password_hash sera différent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    echo password_hash('password', PASSWORD_DEFAULT);
    echo "\n";
    echo password_hash('password', PASSWORD_DEFAULT);
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $2y$10$ACIXdypgOzOnlS9.ow.GGevRIcaliEXDELcgSi2uvWINSQoXGeay2
    $2y$10$z9yKUDbQddpsX5bVr8Feku2kHZzLC6WPHvnQ6LjqDyEKM/lnQpzDi
    Password_hash génère des hashs différents pour un même mot de passe. C'est tout l'intérêt.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 47
    Points
    47
    Par défaut problème avec :mysqli_fetch_row() expects parameter 1 to be mysqli_result
    j'ai tout fait, voici le message d'erreur qui affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given
    sur cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = mysqli_fetch_row($Requete);
    avec le formulaire suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?php
    /*
    Page: login.php
    */
    session_start(); // à mettre tout en haut du fichier .php, cette fonction propre à PHP servira à maintenir la $_SESSION
    $error=''; // Variable To Store Error Message
    if(isset($_POST['submit'])) { // si le bouton "Connexion" est appuyé
        // on vérifie que le champ "username" n'est pas vide
        // empty vérifie à la fois si le champ est vide et si le champ existe belle et bien (is set)
        if(empty($_POST['username'])) {
            $error = "Le champ username est vide.";
        } else {
            // on vérifie maintenant si le champ "Mot de passe" n'est pas vide"
            if(empty($_POST['password'])) {
               $error = "Le champ Mot de passe est vide.";
            } else {
                // les champs sont bien posté et pas vide, on sécurise les données entrées par le membre:
                $username = htmlentities($_POST['username'], ENT_QUOTES, "utf-8"); // le htmlentities() passera les guillemets en entités HTML, ce qui empêchera les injections SQL
                $user_password = htmlentities($_POST['password'], ENT_QUOTES, "utf-8");
                //on se connecte à la base de données:
                $mysqli = mysqli_connect("localhost", "root", "mondieu", "inend");
                //on vérifie que la connexion s'effectue correctement:
                if(!$mysqli){
                    $error = "Erreur de connexion à la base de données.";
                } else {
                    // on fait maintenant la requête dans la base de données pour rechercher si ces données existe et correspondent:
                    $Requete = mysqli_query($mysqli,"SELECT hash FROM user WHERE username = '" . mysqli_real_escape_string($mysqli, $username) . "'");
                    // si il y a un résultat, mysqli_num_rows() nous donnera alors 1
                    // si mysqli_num_rows() retourne 0 c'est qu'il a trouvé aucun résultat
    				$result = mysqli_fetch_row($Requete);
    				if (!$result) {
    					$error = "L'utilisateur est incorrect.";
    				} else {
    					$hash = $result[0];
                    if(password_verify($user_password, $hash)) {
    					//if (mysqli_num_rows($Requete) == 1) {
                        // on ouvre la session avec $_SESSION:
                        $_SESSION['login_user'] = $username; // la session peut être appelée différemment et son contenu aussi peut être autre chose que le username
    					header("location: membre.php"); // Redirecting To Other Page
    					}else {
                        $error = "Le username ou le mot de passe est incorrect, le compte n'a pas été trouvé.";
    					}
     
                    } 
                }
            }
        }
    }
    ?>
    sauf que je dois remplacer les htmlentities() mais c'est pas encore fait, et je quoi c'est pas ça le problème.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Ne lance pas deux fils en parallèle sur le même sujet, s'il te plaît. Ferme ce sujet et va sur l'autre uniquement, autrement c'est difficile pour les gens de t'aider.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tester deux mots de passes
    Par ramzi87 dans le forum Langage
    Réponses: 7
    Dernier message: 12/09/2015, 15h32
  2. [PHP 5.3] Comparaison de deux champs de mot de passe
    Par leweb81 dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2013, 13h44
  3. ouverture de session par 1 Login et DEUX mots de passe
    Par pierredupont dans le forum Sécurité
    Réponses: 4
    Dernier message: 22/07/2009, 16h48
  4. [Delphi] Lecture et comparaison de mots de passe
    Par Jayceblaster dans le forum Langage
    Réponses: 6
    Dernier message: 22/04/2006, 12h21
  5. Encodage et comparaison de mot de passe
    Par SuperCed dans le forum Sécurité
    Réponses: 4
    Dernier message: 27/05/2005, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo