PHP

Problème avec "crypt()"

Résolu

Bonjour,


Je suis actuellement en train de suivre la série de vidéo "Créer son site de A à Z" et je suis rendu à la 3ème vidéo sur la page de connexion. Tout marche nickel sauf quand je fais exprès de faire une erreur dans le mail ou le mdp lors de la connexion. En fait ça m'affiche bien "Le mail ou le mot de passe est incorrecte" mais j'ai une erreur au dessus qui dit : Deprecated: crypt(): Supplied salt is not valid for DES. Possible bug in provided salt format.

Du coup j'ai essayé de changer crypt() par password_verify, ça enlève bien l'erreur mais du coup je n'arrive plus du tout à me connecter donc ça doit pas être ça 😆

Du coup je voulais savoir si vous auriez une idée du problème.


Voici mon code connexion.php :


<?php
    session_start();


    include('bd/connexionDB.php'); // Fichier PHP contenant la connexion à votre BDD


  // S'il y a une session alors on ne retourne plus sur cette page  
    if (isset($_SESSION['id'])){
        header('Location: index.php');
        exit;
    }


    // Si la variable "$_Post" contient des informations alors on les traitres
    if(!empty($_POST)){
        extract($_POST);
        $valid = true;


        if (isset($_POST['connexion'])){


            $mail = htmlentities(strtolower(trim($mail)));
            $mdp = trim($mdp);


            if(empty($mail)){ // Vérification qu'il y est bien un mail de renseigné
                $valid = false;
                $er_mail = "Veuillez mettre un mail";
            }


            if(empty($mdp)){ // Vérification qu'il y est bien un mot de passe de renseigné
                $valid = false;
                $er_mdp = "Veuillez mettre un mot de passe";
            }


            // On fait une requête pour savoir si le couple mail / mot de passe existe bien car le mail est unique !
            $req = $DB->query("SELECT * 
                FROM utilisateur 
                WHERE mail = ? AND mdp = ?",
                array($mail, crypt($mdp, "$6i8qVRuopn1Eksidfygdsljfnfksk254f5d5dd9d6d3f2gh55dc2b5")));


            $req = $req->fetch();


            // Si on a pas de résultat alors c'est qu'il n'y a pas d'utilisateur correspondant au couple mail / mot de passe
            if ($req['id'] == ""){
                $valid = false;
                $er_mail = "Le mail ou le mot de passe est incorrecte";
            }


            // S'il y a un résultat alors on va charger la SESSION de l'utilisateur en utilisateur les variables $_SESSION
            if ($valid){


                $_SESSION['id'] = $req['id']; // id de l'utilisateur unique pour les requêtes futures
                $_SESSION['nom'] = $req['nom'];
                $_SESSION['prenom'] = $req['prenom'];
                $_SESSION['mail'] = $req['mail'];


                header('Location:  index.php');
                exit;
            }   
        }
    }
?>
870 vues
18 décembre 2020 à 19:54 (Édité)
Cette pub permet au site de vivre ...

12 commentaires

Re,


J'ai enlevé la condition if($valid) et toutes les variables $valid de la page connexion.php (je sais pas si je dois enlever également celle de la page inscription.php) mais du coup ça ne fonctionne toujours pas. J'ai surement mal fait 😆


Voici mon code PHP de la page connexion.php :


<?php
    session_start();

    include('bd/connexionDB.php'); // Fichier PHP contenant la connexion à votre BDD

  // S'il y a une session alors on ne retourne plus sur cette page  
    if (isset($_SESSION['id'])){
        header('Location: index.php');
        exit;
    }

    // Si la variable "$_Post" contient des informations alors on les traitres
    if(!empty($_POST)){
        extract($_POST);

        if (isset($_POST['connexion'])){

            $mail = htmlentities(strtolower(trim($mail)));
            $mdp = trim($mdp);

            if(empty($mail)){ // Vérification qu'il y est bien un mail de renseigné
                $er_mail = "Veuillez mettre un mail";
            }

            if(empty($mdp)){ // Vérification qu'il y est bien un mot de passe de renseigné
                $er_mdp = "Veuillez mettre un mot de passe";
            }

            // On fait une requête pour savoir si le couple mail / mot de passe existe bien car le mail est unique !
            $req = $DB->query("SELECT * 
                FROM utilisateur 
                WHERE (mail = :username)");
            	$req->execute(['username' => $_POST['mail']]);
                $user = $req->fetch();
                if (password_verify($mdp, $user->mdp))
                {

               	$_SESSION['id'] = $req['id']; // id de l'utilisateur unique pour les requêtes futures
                $_SESSION['nom'] = $req['nom'];
                $_SESSION['prenom'] = $req['prenom'];
                $_SESSION['mail'] = $req['mail'];
                $_SESSION['mdp'] = $req['mdp'];

                header('Location:  index.php');
                exit;
                }

            $req = $req->fetch();

            // Si on a pas de résultat alors c'est qu'il n'y a pas d'utilisateur correspondant au couple mail / mot de passe
            if ($req['id'] == ""){
                $er_mail = "Le mail ou le mot de passe est incorrecte";
            }  
        }
    }
?>

Re @Robiox !


Je vois que tu as utilisé une variable $valid.


Pourquoi pas enlever la condition if($valid); de supprimer tous les autres variables $valid et faire que si le mot de passe est correct, tu charges directement tes variables de $_SESSION ?


ça te ferai gagner quelques lignes

Re @Flomir !


Mais du coup je ne comprends pas, je dois mettre ça à l'intérieur de mon if(password_verify() ?


            // S'il y a un résultat alors on va charger la SESSION de l'utilisateur en utilisateur les variables $_SESSION
            if ($valid){


                $_SESSION['id'] = $req['id']; // id de l'utilisateur unique pour les requêtes futures
                $_SESSION['nom'] = $req['nom'];
                $_SESSION['prenom'] = $req['prenom'];
                $_SESSION['mail'] = $req['mail'];


                header('Location:  index.php');
                exit;
            }  

Re @Robiox !


Oui c'est ça tu le fais plus bas et tu le rediriges vers la page d'accueil de ton site, super 👍

Tu peux le mettre en résolu 👌


Florent 😏

Ah OK je comprends mieux pourquoi ça ne marche pas si ça ne fonctionne qu'en condition ! Mais du coup pour "//ICI ton cryptage est le même que le mot de passe rentré par l'utilisateur" j'ai pas trop compris ce qu'il faut mettre. Et pour "// Tu peux charger tes variables de $_SESSION ..." je vois ce que tu veux dire mais je crois que je le fais déjà un peu plus bas dans le code vu que j'ai suivi la vidéo.


En tout cas merci pour ton aide ! 🙂


            // S'il y a un résultat alors on va charger la SESSION de l'utilisateur en utilisant les variables $_SESSION
            if ($valid){

                $_SESSION['id'] = $req['id']; // id de l'utilisateur unique pour les requêtes futures
                $_SESSION['nom'] = $req['nom'];
                $_SESSION['prenom'] = $req['prenom'];
                $_SESSION['mail'] = $req['mail'];

                header('Location:  index.php');
                exit;
            }  

Re @Robiox !!


Content que tu ai pu réussir à crypter correctement ton mot de passe avec password_BCRYPT !


Alors c'est tout à fait normal que cela te mette une erreur car tu n'as pas le droit d'écrire ça !

Le password_verify($mdp, $user->mdp); sert à vérifier dans une condition si ton mot de passe est bon !


Donc par exemple :


if(password_verify($_POST['password'], $user->password)){
    // ICI ton cryptage est le même que le mot de passe rentré par l'utilisateur // Tu peux charger tes variables de $_SESSION ...


Voilà, je pense que tu comprends pourquoi cela ne fonctionnais pas !


Florent 🙂

Salut @Flomir 🙂


Alors pour password_hash ça marche, j'ai bien le mdp chiffré dans ma BDD lors de l'inscription. En revanche quand j'essaye de me connecter, ça ne marche pas avec password_verify, j'ai essayé de reprendre ton exemple en adaptant avec mon code vu que j'ai suivi le tuto "Créer son site de A à Z".


J'ai 4 erreurs qui sont :


  • Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':username)' at line 3
  • Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''test@gmail.com')' at line 3
  • Warning: Attempt to read property "mdp" on bool
  • Warning: Trying to access array offset on value of type bool


Ma table se nomme utilisateur et voici le nom de mes champs de la table utilisateur sont : id, nom, prenom, mail, mdp et date_creation_compte


Voici mon bout de code connexion.php :


            // On fait une requête pour savoir si le couple mail / mot de passe existe bien car le mail est unique
            $req = $DB->query("SELECT * 
                FROM utilisateur 
                WHERE (mail = :username)");
            	$req->execute(['username' => $_POST['mail']]);
                $user = $req->fetch();
                password_verify($mdp, $user->mdp);

            $req = $req->fetch();

Bonsoir @Robiox 🙂 !


Oui, moi j'utilise plutôt password_hash et password_verify, je trouve que la sécurité est largement suffisante pour mon utilisation personnel !

On peut rajouter un coup supplémentaire aussi si tu veux plus de sécurités 🖥️ !


Regarde la documentation si tu veux en savoir plus : voir ici 😁


Pour le "hasher" :


$password = password_hash($_POST['password'], PASSWORD_BCRYPT);


Pour vérifier ton hash par exemple :


$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username)');
       $req->execute(['username' => $_POST['username']]);
       $user = $req->fetch();
password_verify($_POST['password'], $user->password)


Bon courage 👌

OK je vais installer XAMPP pour voir ce que ça donne, merci !


Mais du coup je me suis un peu renseigné à propos de la fonction crypt() et on m'a dit qu'elle sera peut être bientôt obsolète et que les fonctions password_hash/password_verify était mieux du coup, je voudrais avoir votre avis là dessus.

Re:


Tu devrais ne plus utiliser Wamp 😉 (voir la raison).

Exporte tout les fichiers de ton projet puis désinstalle Wamp avec Revo Uninstaller !

Ensuite installe XAMPP directement puis mets les fichiers de ton projet dans le répertoire "htdocs" (situé dans "C:\xampp\htdocs") tout en laissant les autres fichiers présents 😉

Redis-nous si le problème persiste 😉

Cette pub permet au site de vivre ...
1
2