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

PHP & Base de données Discussion :

Formulaire de connexion securise php/mysqli [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut Formulaire de connexion securise php/mysqli
    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?

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Le plus simple (et le plus sécurisé), c'est d'appliquer la même règle de cryptage sur la donnée récupérée du formulaire et de comparer la valeur du formulaire cryptée avec la donnée en base.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut Comment Comparer le mot de passe rentrer par l'utilisateur avec celui de la base de données crypté.
    je suis vraiment coincé, est-ce qu'on peut m'aider s'il vous plait? comment est-que je peux modifier ce code:
    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
     
                }
            }
        }
    }
    }
    ?>
    pour pouvoir comparer le mot de passe rentrer par l'utilisateur avec celui de la base de données crypté avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash = password_hash($user_password, PASSWORD_DEFAULT);
    dans le formulaire d'inscription. s'il vous plait donnez moi une idée de comparaison please.
    j'ai beaucoup essayé je n'ai pas réussi à comparer celui de l'utilisateur et celui de la base. Merci d'avance.

    NB: j'ai une idee de comparaison en PDO mais je ne peux pas le réaliser en MYSQLI, j'aimerais pouvoir le faire en PHP/MySQLI.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Déjà, tu retires ces appels à htmlentities : ça ne sécurise absolument rien au niveau de la base de données, ça n'empêche pas les injections SQL et ça va te brouiller tes données. Pour sécuriser des données avec mysqli, c'est la fonction mysqli_real_​escape_​string qu'il faut utiliser (ou les requêtes préparées, mais j'ai du mal avec les requêtes préparées à la mode mysqli)

    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."'");
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut Comment Comparer le mot de passe rentré par l'utilisateur avec celui crypté de la base de données.
    Salut,
    merci beaucoup pour ta réponse, mais ça ne marche pas. on me réfère à cette fonction "password_verify" mais je ne sais pas comment l'utiliser.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut vérification mot de passe utilisateur et celui crypté de la base de donnees en php/mysqli
    j'ai essayé de comparer les deux mots de passes en utilisant la fonction "password_verify" mais ça ne fonctionne pas non plus.
    //on vérifie que la connexion s'effectue correctement:
    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
     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 = '".$user_password."'");
                    // 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
    				$hash = password_hash($user_password, PASSWORD_DEFAULT);
                    if(mysqli_num_rows($Requete) == 1) {
    					if (password_verify($user_password, $hash)) {
                        // 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é.";
    					}
                }

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut vérification mot de passe utilisateur et celui crypté de la base de donnees en php/mysqli
    bonjours à tous, j'ai toujours le même problème mais j'ai essayé de modifier mon code comme suite:
    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", "", "");
                //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é.";
    					}
     
                    } 
                }
            }
        }
    }
    ?>
    et voici l'erreur que j'ai trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in
    sur cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = mysqli_fetch_row($Requete);
    pouriez vous me dire s'qui ce passe svp?

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Comme indiqué, mysqli_fetch_row attend un résultat et tu lui passes un booléen. Typiquement, ça correspond à une requête qui plante.
    Tu peux ajouter un contrôle après l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $Requete = mysqli_query($mysqli,"SELECT hash FROM user WHERE username = '" . mysqli_real_escape_string($mysqli, $username) . "'");
     
    $result = 0;
    if ($Requete !== false) {
    	// 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);
    } else {
    	printf("Message d'erreur : %s\n", mysqli_error($link));
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut problème avec :mysqli_fetch_row() expects parameter 1 to be mysqli_result
    Salut, merci pour ton idée, je suis tellement brouillé, j'arrive pas à l'adapter à mes besoins dans mon formulaire. je te donne le code du formulaire en question, pourrais tu m'aider stp? je t'en supplie.
    voici mon code:
    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); //je quoi que le problème commence à partir de là
    				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é.";
    					}
    				
                    } 
                }
            }
        }
    }
    ?>

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Il suffit de suivre les recommandations :
    Retirer les appels à htmlentities qui ne servent à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $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");
    à remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $username = $_POST['username'];
    $user_password = $_POST['password'];
    Ajouter un test pour vérifier que la requête s'est bien passée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $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); //je quoi que le problème commence à partir de là
    à remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $Requete = mysqli_query($mysqli, "SELECT hash FROM user WHERE username = '" . mysqli_real_escape_string($mysqli, $username) . "'");
     
    $result = false;
    if ($Requete === false) {
    	printf("Message d'erreur : %s\n", mysqli_error($mysqli));
    } else {
    	$result = mysqli_fetch_row($Requete); //je quoi que le problème commence à partir de là
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut
    salut encore a vous tous, voici mon nouveau code ça n'a toujours pas marcher. il affiche le message suivant: "Le username ou le mot de passe est incorrect, le compte n'a pas été trouvé." pourtant le mot de passe est bien dans la base mais il est crypté, comment ce fait-il que la comparaison n'est pas fait? aider moi à trouver l'erreur s'il us plait?
    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
    <?php
    session_start();
    $error=''; 
    include 'database.php';
    if(isset($_POST['submit'])) { 
        if(empty($_POST['username'])) {
            $error = "Le champ username est vide.";
        } else {
            if(empty($_POST['password'])) {
               $error = "Le champ Mot de passe est vide.";
            } else {
                $username =  mysqli_real_escape_string($database, $_POST['username']);
                $user_password =  mysqli_real_escape_string($database, $_POST['password']);
    			 if(!$database){
                    $error = "Erreur de connexion à la base de données.";
                } else {
                    $Requete = mysqli_query($database,"SELECT password FROM user WHERE username = '" . mysqli_real_escape_string($database, $username) . "'");
    				$result = mysqli_fetch_row($Requete);
    				if (!$result) {
    					$error = "L'utilisateur est incorrect.";
    				} else {
    					$hash = $result[0];
                    if(password_verify($user_password, $hash)) {
                        $_SESSION['login_user'] = $username; 
    					header("location: membre.php");
    					}else {
                        $error = "Le username ou le mot de passe est incorrect, le compte n'a pas été trouvé.";
    					}
                    } 
                }
            }
        }
    }
    ?>

  12. #12
    Membre Expert

    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
    Par défaut
    Dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Requete = mysqli_query($database,"SELECT password FROM user WHERE username = '" . mysqli_real_escape_string($database, $username) . "'");
    mysqli_real_escape_string($database, $username) est inutile, tu as déjà échappé $username une première fois.


    Après Fais ceci: Est-ce que ça donne le hash?

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut
    salut, et voici ce que vous m'avez de mander:
    mon code php:
    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
    <?php
    session_start();
    $error=''; 
    include 'database.php';
    if(isset($_POST['submit'])) { 
        if(empty($_POST['username'])) {
            $error = "Le champ username est vide.";
        } else {
            if(empty($_POST['password'])) {
               $error = "Le champ Mot de passe est vide.";
            } else {
                $username = $_POST['username'];
                $user_password = $_POST['password'];
     
    			 if(!$database){
                    $error = "Erreur de connexion à la base de données.";
                } else {
                    $Requete = mysqli_query($database,"SELECT password FROM user WHERE username = '" . mysqli_real_escape_string($database, $username) . "'");
    				$result = mysqli_fetch_row($Requete);
    				if (!$result) {
    					$error = "L'utilisateur est incorrect.";
    				} else {
    					$hash = $result[0];
    					echo $hash; exit;
    					// pour débug : à supprimer ensuite
    					var_dump('user_password : ' . $user_password);
    					var_dump('hash : ' . $hash);
     
    					if(password_verify($user_password, $hash)) {
    						$_SESSION['login_user'] = $username; 
    						header("location: membre.php");
    						exit();
    					}else {
    						$error = "Le username ou le mot de passe est incorrect, le compte n'a pas été trouvé.";
    					}
                    } 
                }
            }
        }
    }
    résultat avec Nom : 2.png
Affichages : 1081
Taille : 6,3 Ko

    résultat sans Nom : 1.png
Affichages : 1206
Taille : 35,3 Ko

    résultat sans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var_dump('user_password : ' . $user_password);
    var_dump('hash : ' . $hash);
    Nom : 3.png
Affichages : 1112
Taille : 20,6 Ko

    voici la structure de ma base en phpmyadmin:
    Nom : 4.png
Affichages : 1208
Taille : 108,1 Ko

  14. #14
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut
    Maintenant vous avez une idée globale de la situation, j’espère que vous aurez pu m'aider avec beaucoup plus de faciliter et que vous allez me donner une réponse beaucoup plus favorable.
    merci d'avance

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 419
    Par défaut
    Salut,

    J'ai pas le temps de regarder en détail pour l'instant mais en survolant j'ai vu que tu avais limité ton mot de passe à 65 caractères. La doc password_hash conseille plutôt 255 caractères. Tu devrais plutôt utiliser cette valeur (255) pour ne pas avoir de problèmes à l'avenir, même si ce n'est pas ton problème actuel.

  16. #16
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut
    je l'ai fait, varchar 255 pour les champs password et confpass

  17. #17
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut
    hey salut, mon problème semble être résoudre voila comment:

    dans le formulaire d'inscription j'ai utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash = password_hash($_POST["password"], PASSWORD_DEFAULT);
    a la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 10));
    et dans le formulaire de connexion j'ai enlevé toutes ces lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo $hash; exit;
    // pour débug : à supprimer ensuite
    					var_dump('user_password : ' . $user_password);
    var_dump('hash : ' . $hash);
    et voila ça fonctionne.

    il me semble que c’était la méthode de hachage que j'avais utilise qui était le problème?
    par exemple celui ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 10));

  18. #18
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut
    mais comment ce fait-il que se hash ne fonctionne pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    password_hash($password, PASSWORD_BCRYPT, array('cost' => 10));

  19. #19
    Membre Expert

    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
    Par défaut
    Citation Envoyé par samgione Voir le message
    mais comment ce fait-il que se hash ne fonctionne pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    password_hash($password, PASSWORD_BCRYPT, array('cost' => 10));
    Aucune idée, cela devrait marcher. De toutes façons, mieux vaut préférer PASSWORD_DEFAULT à PASSWORD_BCRYPT. Ça garantit que la sécurité des mots de passe évolue et se renforce avec les futures versions de PHP, plutôt que de se limiter à bcrypt. Donc ton formulaire marche maintenant?

  20. #20
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Par défaut
    Merci beaucoup à vous tous qui avaient pris le temps de m'aider, j'ai combiné tous vos propositions pour parvenir à une solution, maintenant mon formulaire fonctionne très bien. A la prochaine pour un autre sujet.
    Samgione

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

Discussions similaires

  1. [MySQL] Pb connexion bdd-php
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/05/2006, 21h54
  2. PB Utilisation formulaire de connexion
    Par stan314 dans le forum Access
    Réponses: 2
    Dernier message: 25/05/2006, 12h59
  3. connexion distante php sur SQL SERVER
    Par grinder59 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/03/2006, 14h59
  4. [Sécurité] Connexion securisée
    Par R@IZER dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2006, 17h18
  5. Erreur connexion MySQL-PHP
    Par specialfox dans le forum Installation
    Réponses: 3
    Dernier message: 27/09/2005, 19h47

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