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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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é.";
    					}
                }

+ 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