Bonjour à tous,

Je suis actuellement en train de concevoir un système d'inscription/connexion en HTML/PHP. Mais j'ai quelques soucis dont je ne parviens pas à me défaire.

Voici mon code PHP permettant d'inscrire un utilisateur.

<?php    

    /* Connexion à la base de données et gestion des erreurs */
    try{
        $dbc = new PDO("mysql:host=ckdhjqodomiform.mysql.db;dbname=ckdhjqodomiform;charset=UTF8", "ckdhjqodomiform", "D0miform01");
        $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
        $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo 'Échec lors de la connexion : ' . $e->getMessage();
    }

    /* Déclaration des variables pour la création du compte dans la table COMPTE de la base de données*/
    $id += 1;
    $nom = $_GET['nom'];
    $prenom = $_GET['prenom'];
    $motDePasse = $_GET['mdp'];

    if(!empty($_GET['email'])) {
        $email = $_GET['email'];
    } else {
        $email = "NULL";
    }

    $telephone = $_GET['tel'];

    switch ($_GET['typeCompte']) {
        case "S":
            $typeUtilisateur = '1';
            break;

        case "P":
            $typeUtilisateur = '2';
            break;

        case "E":
            $typeUtilisateur = '3';
            break;
    }

    /* Préparation de la requête pour éviter les injections SQL dans la base de données via les champs de textes des formulaire*/
    $requete = $dbc->prepare("INSERT INTO COMPTE(id, nom, prenom, motDePasse, email, telephone, typeUtilisateur, cleMDP) VALUES (:id, :nom, :prenom, :motDePasse, :email, :telephone, :typeUtilisateur, :cleMDP)");
    $requete->bindParam(':id', $id);
    $requete->bindParam(':nom', $nom);
    $requete->bindParam('prenom', $prenom);
    $requete->bindParam('motDePasse', $motDePasse);
    $requete->bindParam('email', $email);
    $requete->bindParam('telephone', $telephone);
    $requete->bindParam('typeUtilisateur', $typeUtilisateur);
    $requete->bindParam('cleMDP', password_hash($motDePasse, PASSWORD_BCRYPT));

    /*Execution du code et creation du compte dans la table COMPTE */
    $requete->execute();
?>

Et voici mon code PHP pour ma connexion aux compte existant

<?php

    /* Connexion à la base de données et gestion des erreurs */
    try{
        $dbc = new PDO("mysql:host=ckdhjqodomiform.mysql.db;dbname=ckdhjqodomiform;charset=UTF8", "ckdhjqodomiform", "D0miform01");
        $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
        $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo 'Échec lors de la connexion : '.$e->getMessage();
    }

    $sql = "SELECT nom, prenom FROM COMPTE";
    $username = $dbc->query($sql);

    $motDePasse = $_GET['motDePasse'];
    $cryptMDP = $dbc->query("SELECT cleMDP FROM COMPTE");
    $data = $cryptMDP->fetch();

    if (password_verify($motDePasse, $data->cleMDP) == true) {
        $loginMessage = "Connexion réussie";
    } else {
        $loginMessage = "Connexion impossible. Vérifiez vos informations";
    }
?>

Je veux que pouvoir me connecter à l'aide d'un nom, prenom et mot de passe, tout ça de façon sécurisé, d'où l'utilisation d'un PDO et de password_hash() et password_verify().

Au final, quand je rentre mes informations, ma variable $loginMessage contient tout le temps cette phrase "Connexion impossible. Vérifiez vos informations" alors que les informations que je rentre sont bonnes.

14 réponses


Bonjour,

Je pense qu'à cette ligne de code tu dois ajouter un WHERE :

$cryptMDP = $dbc->query("SELECT cleMDP FROM COMPTE");

Cette ligne devient :

$cryptMDP = $dbc->query("SELECT cleMDP FROM COMPTE WHERE nom=".$username->nom." AND prenom=".$username->prenom);

Hmm... J'ai essayé d'appliquer ton conseil, mais soit c'est pas ça, soit c'est ça et je sais pas comment l'appliquer correctement, mais dans tout les cas, ça ne marche pas

<?php

    /* Connexion à la base de données et gestion des erreurs */
    try{
        $dbc = new PDO("mysql:host=ckdhjqodomiform.mysql.db;dbname=ckdhjqodomiform;charset=UTF8", "ckdhjqodomiform", "D0miform01");
        $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
        $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo 'Échec lors de la connexion : '.$e->getMessage();
    }

    $sql = "SELECT nom, prenom FROM COMPTE";
    $user = $dbc->query($sql);
    $username = $user->fetch();

    $motDePasse = $_GET['motDePasse'];
    $cryptMDP = $dbc->query("SELECT cleMDP FROM COMPTE WHERE nom=".$username['nom']." AND prenom=".$username['prenom']);
    $data = $cryptMDP->fetch();

    if (password_verify($motDePasse, $data['cleMDP']) == true) {
        $loginMessage = "Connexion réussie";
    } else {
        $loginMessage = "Connexion impossible. Vérifiez vos informations";
    }
?>

Est-ce que tu peux faire un var_dump ?

var_dump($username, $data);

Non pas trop car je tombe sur une HTTP ERROR 500

Coupe le serveur et re-lance le après modification juste pour en étre sure.

"Connexion impossible. Verifiez vos informations.NULL NULL"

bonjour.
si erreur 500 alors les erreurs php ne sont pas activé
la requête avec le where se fait aussi en requête préparée comme tu l'as fait à l'insertion
et les données du where viennes du formulaire donc en $_GET pour ta

Ca fait un pti moment que j'ai pas mis les pieds dans PHP mais à aucun moment tu t'enexcute ta requete, à moins que PDO ai changé, mais à mon époque apres un query ou un prepare on faisait un execute()

    $cryptMDP->execute()
    $data = $cryptMDP->fetch();

Et comme la dit Carouge, c'est une requete préparé vue que tu récup des infos tapé par l'utilisateur.
Et soit tu bindPram soit tu met des palceholder (?,?,?,?) et tu execute sur l'array()

Non pas d'execute avec query, regarde la doc
Perso, je préfère les marqueurs nommés, c'est plus facile a comprendre que d'avoir des "?"

Yep du coup je suis allez jetez un oeil, désolez pour la mauvaise information.

c'est en faisant des erreurs que l'on apprends

Est-ce que tu peux nous envoyer ta page HTML du formulaire de connexion ? Là où tu met nom, prénom et mpd.

Bonjour.

Ta logique pour la requête SQL est fausse, tu dois plutôt d'abord faire la condition sur le champ prenom et le champ nom pour le select, si tu récupères bien un enregistrement, tu vérifies ensuite si le mot de passe concorde au niveau PHP.

Par exemple:

<?php
$statement = $dbc->prepare('SELECT cleMDP FROM COMPTE WHERE nom = :nom AND prenom = :prenom');
$statement->execute(['nom' => $_GET['nom'], 'prenom' => $_GET['prenom']]);
$user = $statement->fetch();
if ($user && password_verify($motDePasse, $user['cleMDP'])) {
    // C'est Ok
}

La soumission d'un formulaire pour une recherche, je suis d'accord, mais pour un formulaire de connexion/inscription par exemple, je ne le suis pas, utilises plutôt la méthode post pour ce type de formulaire.

Par contre tu fais n'importe quoi pour l'attribution des attribut lors de la connexion à la base de donnée, tu ne peux définir qu'une valeur pour un attribut, par conséquent les deux définitions pour ATTR_ERRMODE sont totalement inutiles, tu ne dois en faire qu'une seule pour l'attribut.

L'authentification des utilisateurs est très courante dans les applications Web modernes. Il s'agit d'un mécanisme de sécurité utilisé pour restreindre l'accès non autorisé aux zones et outils réservés aux membres sur un site. jiofi.local.html avast driver