Requète préparée avec PDO

Résolu
Bonjour,

Je souhaiterai convertir enfin je veux dire passer mes requètes traditionnelles en requète préparée avec PDO
Je n'arrive pas à mettre en place cette fonction, si quelqu'un pourrais me donner quelques petites explications.
Cette fonction marche bien avec ma connexion actuelle Mysql mais je vais changer la requète de connexion et passer en requète préparée avec PDO
Merci de votre gentillesse.
<?php
function user_exists($username) {
    $username = filtres($username);
    return (mysql_result(mysql_query("SELECT COUNT(id_adherent) FROM tb_adherent WHERE username = '$username'"), 0) == 1) ? true : false;
}
?>

37 réponses

Résumé de la discussion

La conversion des requêtes traditionnelles en requêtes préparées avec PDO est motivée par le passage d’une connexion MySQL locale à une connexion PDO sécurisée pour vérifier l’existence d’un utilisateur. Il faut fournir une instance PDO à la fonction de vérification et utiliser des requêtes préparées avec des paramètres nommés, afin d’éviter l’injection et d’assurer une exécution fiable. Des divergences apparaissent lorsque l’ancien code mélange mysql_* et PDO, la meilleure approche consiste à remplacer les appels mysql_result et mysql_query par des méthodes PDO telles que prepare, bindParam et fetchColumn. En cas de doute, il est fréquent de passer deux paramètres à la fonction de vérification : l’objet PDO et le nom d’utilisateur, afin d’effectuer une requête sécurisée et fiable.

Bobot (l’IA à votre service)
  1. Bonjour
    Il y a lontemps que je galère pour faire un fichier de connexion avec toutes les sécurisations necessaires mais en vain.
    Ma fonction session_start() est inclu je ne l'ai pas mise.
    Merci vraiment pour ton aide
    Voici mon fichier de connexion
    <?php
    //L'adresse IP du serveur sous lequel le script courant est en train d'être exécuté.
    if ($_SERVER['SERVER_ADDR'] == '127.0.0.1'){
    //données pour la connexion à la base de données local
    $PARAM_hote        ='localhost';     	//nom du serveur mysql
    $PARAM_nom_bdd     ='ma_base'; 	//le nom de la base de données
    $PARAM_utilisateur ='root';          	//login
    $PARAM_mot_passe   ='';              	//mot de passe pour se connecter
    
    	try{
    //connexion à la BDD (Création d'une instance de la classe PDO)
    //On cré l'objet $bdd à l'aide de la commande new suivi du nom de la classe
        $bdd = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bdd, $PARAM_utilisateur, $PARAM_mot_passe);
        
        $bdd->exec("SET CHARACTER SET utf8");
        $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    	}
    
    	catch(Exception $e){
    //sinon on affiche l'erreur
        echo 'Impossible de se connecter à la base de donnée</br>';
        echo 'Erreur : ' .  $e->getMessage() . '<br />';
        echo 'N° : ' .      $e->getCode();
    	}
    }
    ?>
    

    Mon fichier de vérification
    <?php
    if (empty($_POST) === false) {	
    
            $username = Security::clean($_POST['username']);
    
            $password = Security::clean($_POST['password']); 
            $password = Security::hash($password);
    
    	$sql = ('SELECT *
    			FROM tb_adherent
    			WHERE username=:username
    			AND password=:password') or die(print_r($bdd->errorInfo()));
    	$requete = $bdd->prepare($sql);
    
        //on execute la requète en lui transmettant la liste des paramètres
        $requete->execute(array(
    							':username' => $username,
    							':password' => $password
    							));
    
        //on affiche les reponses de la requète dans un tableau
        $donnees = $requete->fetch();
    
        if (empty($username) === true || empty($password) === true) {
            $errors[] = 'Veuillez entrer le Login et le Mot de passe';
        } else if (user_exists($username) === false) {
            $errors[] = 'Le Login et / ou le Password n\'existe pas.';
        } else {      
            $login = login($username, $password);
            if ($login === false) {
                $errors[] = 'La combinaison Login/Mot de passe est incorrect';
            } else {
                $_SESSION['id_adherent'] 		= $login;
                header('Location: index.php');
                exit();
            }
        }
    }
    ?>
    

    Mes fonctions, par contre la fonction login en requète préparée et je ne sais pas si la fonction filtres fait doublon avec la fonction clean ?
    <?php
    //Méthode de hachage pour le password
    class Security {
        const GRAIN = 'f?,j89-k0.;-!?lqjçs_di3%5a6_4jhfgh';
    
        public static function hash($donnees) {
            return sha1(md5($donnees) . self::GRAIN . sha1($donnees . self::GRAIN) . $donnees);
        }
        public static function clean($donnees) {
            return htmlspecialchars(trim($donnees));
        }
    }
    
    function filtres($donnees) {
        return htmlentities(strip_tags(mysql_real_escape_string($donnees)));
    }
    
    function user_exists($username) {
        $username = filtres($username);
    
        $req = $bdd->prepare('SELECT COUNT(*) FROM tb_adherent WHERE username = :user');
        $req->bindParam(':user', $username, PDO::PARAM_STR);
        $req->execute();
        $count = $req->fetchColumn();
    
        return ($count == 0) ? false : true;
    }
    
    function login($username, $password) {
        
        $username = filtres($username);
        
        return (mysql_result(mysql_query("SELECT COUNT(id_adherent) FROM tb_adherent WHERE username = '$username' AND password = '$password'"), 0) == 1) ? $id_adherent : false;
    }
    ?>
    
    1. Bonjour
      Ca me ferai très plaisir de pouvoir finaliser le hashage du COOKIE.
      Mais là vraiment j'ai essayé beaucoup de solution et impossible d'arriver à mes fins.
      Si toute fois pour une dernière tu pourrais t'y pencher dessus , sans quoi je n'y arriverai pas.
      Merci infiniment de ton aide.
      1. Bonjour
        Malheureusement c'est encore moi en fait je n'ai plus l'erreur, mais je reste pas connecté automatiquement.
        Merci
        1. Bonjour
          J'ai trouvé une erreur lorsque la combinaison login/password ne correspondent pas
          Catchable fatal error: Argument 1 passed to User::setUserDatas() must be an array, boolean given, called in......

          je crois que c'est tout lié avec cette fonction enfin je ne suis pas sur...
          public function setUserDatas(array $d) {
              if(!empty($d)) {
                 $this->id = $d['id'];
                 $this->username = $d['username'];
                 $this->email = $d['email'];
                 $this->password = $d['password'];
                 $this->hash = $d['hash_cookie'];
              }
          }
          
          1. Bonjour
            je ne reste pas connecté malgrés le COOKIE avant le hash du OOKIE c'étais impec. alors ça ne doit pas bien être grave mais j'ai essayé de voir si je voyais un problème mais rien, alors encore une fois je m'en remet à toi.
            aucune erreur de retournée.
            Merci beaucoup.
            1. Bonjour

              Oui c'est vrai que pour une question ça fait un sujet énorme, mais tu m'a initié au class avec methode et POO.
              C'est tellement bien que je veux bien comprendre et avec toi j'ai déjà bien avancé.
              Mais c'est vrai que je n'avais jamais créé de COOKIE et pour moi c'est tout nouveau et aussi très complexe, sans toi je n'aurai jamais pu y arriver.
              Merci beaucoup.
              Désolé une petite erreur pour finaliser tout ça après je serai comblé.

              Notice: Undefined property: User::$db in.........
              1. J'ai pris une ancienne version de user.php, je corrige !

                public static function get($username) {
                        self::init();
                
                        $req = self::$db->prepare('SELECT id_adherent FROM tb_adherent WHERE login = :u');
                        $req->bindParam(':u', $username, PDO::PARAM_STR);
                        $req->execute();
                
                 $id = $req->fetchColumn();
                
                        return ($id) ? new self((int) $id) : null;
                }
                
                public function update() {
                        $req = self::$db->prepare('UPDATE tb_adherent SET login = :u, email = :e, password = :p, hach_cookie = :h WHERE id = :id');
                        $req->bindParam(':u', $this->username, PDO::PARAM_STR);
                        $req->bindParam(':e', $this->email, PDO::PARAM_STR);
                        $req->bindParam(':p', $this->password, PDO::PARAM_STR);
                        $req->bindParam(':h', $this->hash, PDO::PARAM_STR);
                        $req->bindParam(':id', $this->id, PDO::PARAM_INT);
                        $req->execute();
                }
            2. Bonjour,
              Super génial ça fonctionne à merveille comment j'aurais pu m'en sortir seul, ça aurai été du domaine de l'impossible.
              Je me permet encore de te demander pour crypter le COOKIE, à propos de ton commentaire ci-dessous.
              J'ai créé un champ hash_cookie.
              Il faut penser à remplacer le mot de passe de l'utilisateur que tu insères dans le cookie par autre chose !
              Je l'ai mis juste a titre d'exemple, mais même si celui-ci est crypté, il faut éviter d'héberger du contenu privé coté client.
              
              Donc tu peux ajouter un deuxième mot de passe dans la table utilisateur.
              Ce deuxième mot de passe contient un hash aléatoire.
              Et à chaque fois que l'utilisateur se connecte VIA le cookie, alors tu mets à jour ce deuxième mot de passe
              

              Merci
              1. On dirais qu'on a dépassé les 50 messages, ça en fait un peu trop pour un seul sujet :) !

                Ajoutes cette méthode à la classe Security.
                public static function getRandomHash() {
                    return self::hash(rand() . sha1(self::GRAIN) . microtime(true));
                }


                Dans login.
                if(!empty($_POST)) {
                    $username = Security::clean($_POST['login']);
                    $password = Security::clean($_POST['password']); 
                
                    if(empty($username) || empty($password)) {
                        $error = 'Veuillez entrer le Login et le Mot de passe';
                    } 
                    else {
                        $password = Security::hash($password);
                
                        $user = new User();
                        $user->setUsername($username);
                        $user->setPassword($password);
                
                        if($user->login()) {
                            if(isset($_POST['remember'])) {
                                $hash = Security::getRandomHash();
                                $time = time() + 3600 * 24 * 3;
                
                                $user->setHash($hash);
                                $user->update();
                 
                                $values[] = Security::crypt($user->getUsername());
                                $values[] = $hash;
                                $values[] = Security::crypt($time);
                
                                setcookie('moncookie', serialize($values), $time);
                            }
                
                            $_SESSION['id_adherent'] = serialize($user);
                            header('Location: index.php?body=compte_profil&type=compte');
                            exit();
                        } else {
                            $error =  'La combinaison Login/Mot de passe est incorrect';
                        }
                    }
                }


                Dans la connexion automatique.
                if(!isset($_SESSION['id_adherent']) && isset($_COOKIE['moncookie'])) {
                    $values = Security::clean($_COOKIE['moncookie']);
                    $values = unserialize($values);
                
                    if(count($values) == 3) {
                        $username = Security::decrypt($values[0]);
                        $hash = $values[1];
                        $time = Security::decrypt($values[2]);
                
                        $user_try = User::get($username);
                
                        if($user_try != null && $user_try->checkHash($hash)) {
                            $values[1] = Security::getRandomHash();
                            $user_try->setHash($values[1]);
                            $user_try->update();
                
                            $_SESSION['id_adherent'] = serialize($user_try);
                
                            setcookie('moncookie', serialize($values), (int) $time);
                
                            header('Location: index.php?body=compte_profil&type=compte');
                            exit();
                        } 
                        else {
                            // A mettre dans le fichier log
                            $error =  'Le Login est incorrect';
                        }
                    } 
                    else {
                        // A mettre dans le fichier log
                        $error =  'Le Cookie est invalide';
                    }
                }


                Dans la classe User.

                private $hash;
                
                public function setHash($h) {
                    $this->hash = $h;
                }
                
                public function setUserDatas(array $d) {
                    if(!empty($d)) {
                       $this->id = $d['id'];
                       $this->username = $d['username'];
                       $this->email = $d['email'];
                       $this->password = $d['password'];
                       $this->hash = $d['hash_cookie'];
                    }
                }
                
                public function checkHash($hash) {
                    return $this->hash == $hash;
                }
                
                public static function get($username) {
                        $req = $this->db->prepare('SELECT id FROM tb_adherent WHERE username = :u');
                        $req->bindParam(':u', $username, PDO::PARAM_STR);
                        $req->execute();
                
                        $r = $req->fetchColumn();
                
                        return ($r == false) ? null : new self($r);
                    }
                
                public function update() {
                    $req = $this->db->prepare('UPDATE tb_adherent SET username = :u, email = :e, password = :p, hash_cookie = :hc WHERE id = :id');
                    $req->bindParam(':u', $this->username, PDO::PARAM_STR);
                    $req->bindParam(':e', $this->email, PDO::PARAM_STR);
                    $req->bindParam(':p', $this->password, PDO::PARAM_STR);
                    $req->bindParam(':hc', $this->hash, PDO::PARAM_STR);
                    $req->bindParam(':id', $this->id, PDO::PARAM_INT);
                    $req->execute();
                }
            3. erreur maintenant

              Fatal error: Call to undefined function decrypt() in C....

              ??
              1. <?php
                class Security {
                
                    const GRAIN = 'f?,j89-k0.;-!?lqjçs_di3%5a6_4jhfgh';
                
                    public static function hash($donnee) {
                        return sha1(md5($donnee) . self::GRAIN . sha1($donnee . self::GRAIN) . $donnee);
                    }
                
                    public static function clean($donnee) {
                        return trim($donnee);
                    }
                
                    public static function crypt($donnee) {
                        $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
                        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
                        $encrypted_string = mcrypt_encrypt(
                              MCRYPT_BLOWFISH, 
                              self::GRAIN,
                              utf8_encode($donnee), 
                              MCRYPT_MODE_ECB, 
                              $iv);
                         return $encrypted_string;
                    }
                
                    public static function decrypt($donnee) {
                        $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
                        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
                        $decrypted_string = mcrypt_decrypt(
                             MCRYPT_BLOWFISH, 
                             self::GRAIN, 
                             $donnee, 
                             MCRYPT_MODE_ECB, 
                             $iv);
                         return $decrypted_string;
                    }
                }
            4. Bonjour
              J'ai vraiment la poisse avec le COOKIE............
              Toujours obligé de me reconnecter, je te redonne mon fichier de reconnexion auto qui est dans index.php on sait jamais....
              <?php session_start();?>
              <?php
              require_once 'connexion/database.php';
              require_once 'class/security.php';
              require_once 'class/user.php';
              require_once 'fonction/general.php';
              ?>
              <?php
              if(isset($_COOKIE) && !isset($_SESSION)) {
                  $values = Security::clean($_COOKIE['moncookie']);
                  $values = explode('_', $values);
              
                  if(count($values) == 2) {
                      $username = Security::decrypt($values[0]);
                      $password = Security::decrypt($values[1]);
              
                      $user_try = new User();
              
                      $user_try->setUsername($username);
                      $user_try->setPassword($password);
              
                      if($user_try->login()) {
                          $_SESSION['id_adherent'] = serialize($user_try);
                          header('Location: index.php?body=compte_profil&type=compte');
                          exit();
                      } else {
                          // A mettre dans le fichier log
                          $error =  'La combinaison Login/Mot de passe est incorrect';
                      }
                  } else {
                      // A mettre dans le fichier log
                      $error =  'Le Cookie est invalide';
                  }
              }
              ?>
              
              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
              

              après il y a le reste mais sans importance
              Merci
              1. if(isset($_COOKIE) && !isset($_SESSION)) {

                C'est quoi cette condition ?
                Jamais cette condition ne retournera "true" car le tableau $_SESSION existe dés que tu fais "session_start".

                Remets la condition originale, et retentes.
            5. Bonjour
              Effectivement il contiens bien "_" alors le return faut le faire ou ?
              J'ai essayé mais toujours aucun résultat.
              Merci pour ton aide précieuse.
              1. Et ben à l'intérieur de tes deux méthodes "crypt" et "decrypt", faut bien qu'elles retournent quelque chose.

                Exemple !

                <?php
                class Security {
                
                    const GRAIN = 'f?,j89-k0.;-!?lqjçs_di3%5a6_4jhfgh';
                
                    public static function hash($donnee) {
                        return sha1(md5($donnee) . self::GRAIN . sha1($donnee . self::GRAIN) . $donnee);
                    }
                
                    public static function clean($donnee) {
                        return trim($donnee);
                    }
                
                    public static function crypt($donnee) {
                        return encrypt($donnee, self::GRAIN);
                    }
                
                    public static function decrypt($donnee) {
                        return decrypt($donnee, self::GRAIN);
                    }
                }
            6. Bonjour
              Ca me retourne ça ??

              Session No, Cookie Yes

              Cookie Username : , Password :
              1. Ajoutes ...
                echo '<br>Cookie : ' . $_COOKIE['moncookie'] . '<br>';


                Si il contient seulement un "_", alors le problème tourne autour de crypt et decrypt, peut être que t'as oublié de faire un return.
            7. Bonjour
              J'ai aucun retour de message d'erreur, je me connecte le COOKIE est créé Lorsque je réouvre mon navigateur je suis sur la page d'accueil de mon site et avec mon formulaire pour me reconnecter c'est tout en fait
              Merci
              1. Alors faut tester, débuger ...

                if(!isset($_SESSION['id_adherent']) && isset($_COOKIE['moncookie'])) {
                        echo '<br>Session No, Cookie Yes<br>';
                
                        $values = Security::clean($_COOKIE['moncookie']);
                        $values = explode('_', $values);
                
                        if(count($values) == 2) {
                            $username = Security::decrypt($values[0]);
                            $password = Security::decrypt($values[1]);
                
                            echo '<br>Cookie Username : ' . $username . ', Password : ' . $password . '<br>';
                
                            $user_try = new User();
                            $user_try->setUsername($username);
                            $user_try->setPassword($password);
                
                            if($user_try->login()) {
                                echo '<br>Cookie datas corrects<br>';
                
                                $_SESSION['id_adherent'] = serialize($user_try);
                                //header('Location: index.php');
                                exit();
                            } 
                            else {
                                // A mettre dans le fichier log
                                $error =  'La combinaison Login/Mot de passe est incorrect';
                            }
                        } 
                        else {
                            // A mettre dans le fichier log
                            $error =  'Le Cookie est invalide';
                        }
                }


                Regarde ce que ça affiche.
            8. Bonjour,
              En ce qui concerne la connexion et la création du COOKIE ça fonctionne correctement, mais pour la connexion automatique lorsque j'ouvre mon navigateur je suis obligé de me reconnecter.
              Encore un coup de main pour finaliser ma connexion s'il te plait et ce sera vraiment génial.
              Merci en tout cas.
              1. Précise un peu quel résultat tu reçoit, quel message est affiché après la tentative de connexion automatique ?
            9. Bonjour

              Apres avoir quitté mon navigateur pour voir si le COOKIE fonctionne lorsque j'ouvre de nouveau mon navigateur ça me retourne cette erreur...
              Notice: Use of undefined constant values - assumed 'values' in
              

              ça correspond à cette ligne
              if(count(values) == 2) {
              

              la connexion auto je l'ai mis dans ma page index.php
              Sinon merci ça m'a beaucoup aidé à comprendre pour moi c'est tout nouveau mais c'est génial.
              Une question pourquoi tu a mis simplement que 2 ligne en commentaire ?

              // A mettre dans le fichier log
              1. C'est $values et non pas values !

                J'ai mis ce commentaire parce que j'ai jugé inutile d'afficher à l'utilisateur que les données du cookie sont invalides.
                Parce que si tu réfléchis bien, il n'y a aucune raison pour que les données soient invalide, SAUF si l'utilisateur a essayé (je ne sais pour quelle raison) de modifier manuellement le contenu du cookie (surement pour tenter de décrypter le contenu du cookie afin de voler la session d'un autre membre), donc au lieu de lui afficher un message "Cookie invalide", on insère plutôt l'information dans un fichier log avec quelque informations supplémentaires (IP, date ...), et si l'IP est statique dans le pays de cet utilisateur, alors tu pourras savoir qui ou combien d'utilisateurs sont "hostiles" envers ton service web.
            10. Le cookie, tu le crée seulement si la connexion a réussi !

              if(!empty($_POST)) {
                  $username = Security::clean($_POST['login']);
                  $password = Security::clean($_POST['password']); 
              
                  if(empty($username) || empty($password)) {
                      $error = 'Veuillez entrer le Login et le Mot de passe';
                  } else {
                      $password = Security::hash($password);
              
                      $user = new User();
                      $user->setUsername($username);
                      $user->setPassword($password);
              
                      if($user->login()) {
                          $_SESSION['id_adherent'] = serialize($user);
              
                          if(isset($_POST['remember'])) {
                              $value = Security::crypt($user->getUsername()) . '_' . Security::crypt($user->getPassword());
              
                              setcookie('moncookie', $value, time() + 3600 * 24 * 3);
                          }
              
                          header('Location: index.php?body=compte_profil&type=compte');
                          exit();
                      } else {
                          $error =  'La combinaison Login/Mot de passe est incorrect';
                      }
                  }
              }
              echo isset($error) ? $error . '<br>' : ''; 


              La session, tu la crée soit via le cookie si celui-ci existe et seulement si la session n'existe pas déjà.

              Donc si tu possèdes une page qui est incluse au début de chaque page du site, comme par exemple config.php ou autre, alors ajoutes y la connexion automatique.

              if(!isset($_SESSION['id_adherent']) && isset($_COOKIE['moncookie'])) {
                      $values = Security::clean($_COOKIE['moncookie']);
                      $values = explode('_', $values);
              
                      if(count(values) == 2) {
                          $username = Security::decrypt($values[0]);
                          $password = Security::decrypt($values[1]);
              
                          $user_try = new User();
                          $user_try->setUsername($username);
                          $user_try->setPassword($password);
              
                          if($user_try->login()) {
                              $_SESSION['id_adherent'] = serialize($user_try);
                              header('Location: index.php');
                              exit();
                          } 
                          else {
                              // A mettre dans le fichier log
                              $error =  'La combinaison Login/Mot de passe est incorrect';
                          }
                      } 
                      else {
                          // A mettre dans le fichier log
                          $error =  'Le Cookie est invalide';
                      }
              }


              Il faut penser à remplacer le mot de passe de l'utilisateur que tu insères dans le cookie par autre chose !
              Je l'ai mis juste a titre d'exemple, mais même si celui-ci est crypté, il faut éviter d'héberger du contenu privé coté client.

              Donc tu peux ajouter un deuxième mot de passe dans la table utilisateur.
              Ce deuxième mot de passe contient un hash aléatoire.
              Et à chaque fois que l'utilisateur se connecte VIA le cookie, alors tu mets à jour ce deuxième mot de passe.
              Comme ça, même si un hacker arrive à décrypter le contenu du cookie, il ne pourra usurper l'identité de la victime que durant une session.

              Mettez en résolu quand c'est résolu ...
              1. Bonjour
                impossible de voir mon erreur, en fait j'arrive à me connecter avec ce script...
                if(!empty($_POST)) {
                    $username = Security::clean($_POST['login']);
                    $password = Security::clean($_POST['password']); 
                
                    if(empty($username) || empty($password)) {
                        $error = 'Veuillez entrer le Login et le Mot de passe';
                    } else {
                        $password = Security::hash($password);
                
                        $user = new User();
                        $user->setUsername($username);
                        $user->setPassword($password);
                
                        if($user->login()) {
                            $_SESSION['id_adherent'] = serialize($user);
                            header('Location: index.php?body=compte_profil&type=compte');
                            exit();
                        } else {
                            $error =  'La combinaison Login/Mot de passe est incorrect';
                        }
                    }
                }
                echo isset($error) ? $error . '<br>' : ''
                

                Mais avec celui-ci impossible, pour la création de COOKIE
                if(isset($_POST['remember'])) {
                    $user = unserialize($_SESSION['id_adherent']);
                    $value = Security::crypt($user->getUsername()) . '_' . crypt($user->getPassword());
                
                    setcookie('moncookie', $value, time() + 3600 * 24 * 3);
                }
                
                elseif(isset($_COOKIE['moncookie'])) {
                    $values = trim($_COOKIE['moncookie']);
                    $values = explode('_', $values);
                
                    if(count(values) == 2) {
                        $username = Security::decrypt($values[0]);
                        $password = Security::decrypt($values[1]);
                
                        $user_try = new User();
                        $user_try->setUsername($username);
                        $user_try->setPassword($password);
                
                        if($user_try->login()) {
                            $_SESSION['id_adherent'] = serialize($user_try);
                            header('Location: index.php');
                            exit();
                        } else {
                            $error =  'La combinaison Login/Mot de passe est incorrect';
                        }
                    } else {
                        $error =  'Le Cookie est invalide';
                    }
                }
                
                echo isset($error) ? $error . '<br>' : ''
                

                Si tu peux y jeter un oeil s'il te plait.
                Je te remercie
                1. Bonjour
                  C'étais bien ce que j'ai fait mais l'erreur est
                  Notice: Undefined index: id_adherent in C
                  et
                  Fatal error: Call to a member function getUsername() on a non-object in C

                  je suis certain que ça va être une connerie de ma part excuse moi.
                  Merci
                  1. Qu'est ce qui te dit que l'erreur provient de la classe Security ?

                    Pour la première erreur (Undefined index) : On dirais que tu mélanges entre les deux nominations $_SESSION['id_adherent'] et $_SESSION['adherent'], utilises soit l'un soit l'autre !

                    Je pense que la deuxième erreur est dépendante de la première.
                2. Bonjour
                  Je me permet de revenir vers toi.
                  En fait dans la class Security je n'arrive pas à mettre en place la méthode crypt et decrypt c'est quelque chose d'un peu compliqué pour moi, j'ai essayé re essayé mais en vain.
                  Merci en tout cas si tu peux encore m'aider à résoudre ce problème.
                  Merci
                  1. Salut,

                    Pourquoi ça, quelle est l'erreur ?

                    <?php
                    class Security {
                    
                        const GRAIN = 'f?,j89-k0.;-!?lqjçs_di3%5a6_4jhfgh';
                    
                        public static function hash($donnee) {
                            return sha1(md5($donnees) . self::GRAIN . sha1($donnees . self::GRAIN) . $donnees);
                        }
                    
                        public static function clean($donnee) {
                            return trim($donnees);
                        }
                    
                        public static function crypt($donnee) {
                            return;
                        }
                    
                        public static function decrypt($donnee) {
                            return;
                        }
                    }
                    ?>
                3. Bonjour
                  Excuse moi de te déranger encore, mais vraiment impossible de mettre en place mon sytéme de COOKIE.
                  Peux tu encore m'aider, j'ain bien fait ce que tu m'a dit et j'ai trouvé sur le net les fonctions crypt et decrypt mais il y a quelque chose qui m'échappe.
                  Merci encore de ton coup de main.
                  1. Bonjour,
                    Je me permet de te demander si tu peux encore me résoudre mon problème de COOKIE.
                    J'essaie de mettre en place le système de COOKIE mais en vain.
                    Le COOKIE s'affiche bien sur mon PC mais il faut quand même que je me reconnecte après la fermeture de mon navigateur.
                    Ca par contre je ne l'ai jamais mis en place sur mon site, j'ai déjà créé le COOKIE
                    Je te remercie
                    if(isset($_POST['remember'])){
                    setcookie('moncookie', ($_SESSION['id_adherent']) . sha1($user->getNom() . $user->getUsername() . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 3, '/', 'localhost', false, true);
                    }
                    
                    1. Ben c'est la même chose l'ami, c'est pareil que ce que j'ai dis plus haut !
                      Avant d'essayer d'accéder à l'objet, il faut le récupérer à partir de sa représentation linéaire, qui est enregistrée dans la session.

                      Par contre, tu ne peux travailler avec "sha", car c'est une fonction de hachage, c'est à dire qu'il n'y a pas de fonction qui fait l'inverse.
                      Donc tu dois chercher une fonction de cryptage/décryptage.

                      Pourquoi tu as besoin de décrypter, parce que lorsque l'utilisateur se connecte, la première chose que tu vérifies est l'existance d'une session, si ce n'est pas le cas, tu vérifies l'existence d'un cookie.
                      Si le cookie existe, tu dois récupérer sa valeur, la décrypter, puis connecter l'utilisateur grâce à la valeur décrypté (id, username ou email).

                      Tu dois également ajouter son mot de passé (haché) afin de vérifier l'identité de l'utilisateur.

                      if(isset($_POST['remember'])) {
                          $user = unserialize($_SESSION['id_adherent']);
                          $value = Security::crypt($user->getUsername()) . '_' . crypt($user->getPassword());
                      
                          setcookie('moncookie', $value, time() + 3600 * 24 * 3);
                      }


                      if(isset($_SESSION['id_adherent'])) {
                          // Utilisateur déja connécté
                          $user = unserialize($_SESSION['id_adherent']);
                      }
                      elseif(isset($_COOKIE['moncookie'])) {
                          $values = trim($_COOKIE['moncookie']);
                          $values = explode('_', $values);
                      
                          if(count(values) == 2) {
                              $username = Security::decrypt($values[0]);
                              $password = Security::decrypt($values[1]);
                      
                              $user_try = new User();
                              $user_try->setUsername($username);
                              $user_try->setPassword($password);
                      
                              if($user_try->login()) {
                                  $_SESSION['id_adherent'] = serialize($user_try);
                                  header('Location: index.php');
                                  exit();
                              }
                              else {
                                  // Les identifiants ne correspondent pas
                              }
                          }
                          else {
                              // Le cookie est invalide
                          }
                      }


                      Voila, n'oublie pas de définit les méthodes "crypt" et "decrypt" dans la classe Security, et d'ajouter la méthode "getPassword" à la classe User.
                  • 1
                  • 2