From 0b5db50d5decf00617544e5d3f128808b1e3fe0c Mon Sep 17 00:00:00 2001 From: ycharbi Date: Thu, 4 Aug 2022 20:31:16 +0200 Subject: [PATCH] Ajout de la fonction "Se souvenir de moi" --- pages/gestion/administration.php | 5 +- pages/visiteurs/formulaire_accueil.php | 6 ++ .../fonctions/sessions/authentification.php | 64 ++++++++++++++++++- .../traitements/utilisateurs/deconnexion.php | 6 +- .../utilisateurs/identification.php | 16 ++--- 5 files changed, 85 insertions(+), 12 deletions(-) diff --git a/pages/gestion/administration.php b/pages/gestion/administration.php index 9a43552..7e376f4 100644 --- a/pages/gestion/administration.php +++ b/pages/gestion/administration.php @@ -4,8 +4,11 @@ * Page centrale de gestion des fonctionnalités du serveur de courriel. * C'est de cette page qu'est appelé l'ensemble des fonctionnalités du portail. */ - session_start(); + +require_once($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/sessions/authentification.php"); +validationCookie($pdo); + require_once($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/sessions/privileges.php"); testPrivileges(); require_once($_SERVER["DOCUMENT_ROOT"]."/inclusions/entete.php"); diff --git a/pages/visiteurs/formulaire_accueil.php b/pages/visiteurs/formulaire_accueil.php index 2a7e68e..edef366 100644 --- a/pages/visiteurs/formulaire_accueil.php +++ b/pages/visiteurs/formulaire_accueil.php @@ -6,6 +6,10 @@ * Redirige les tentative d'identification pour traitement et test de légitimité. */ session_start(); + +require_once($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/sessions/authentification.php"); +validationCookie($pdo); + if (isset($_SESSION['id_utilisateur']) && isset($_SESSION['pseudo_utilisateur']) && isset($_SESSION['nom_utilisateur']) && isset($_SESSION['privilege_utilisateur']) && !empty($_SESSION['id_utilisateur']) && !empty($_SESSION['pseudo_utilisateur']) && !empty($_SESSION['nom_utilisateur']) && !empty($_SESSION['privilege_utilisateur'])) { header ("location: /pages/gestion/administration.php?page=accueil"); die(); @@ -45,6 +49,8 @@ require_once($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/messages/messages.ph + + diff --git a/services/fonctions/sessions/authentification.php b/services/fonctions/sessions/authentification.php index bcdc3d3..84cde9a 100644 --- a/services/fonctions/sessions/authentification.php +++ b/services/fonctions/sessions/authentification.php @@ -17,7 +17,7 @@ function validationIdentifiants($pdo,$identifiant,$mdp) { $req = 'SELECT * FROM postfix_utilisateurs WHERE utilisateur=:identifiant'; $sql = $pdo->prepare($req); - $sql->bindValue(':identifiant', $identifiant); + $sql->bindValue(':identifiant', htmlspecialchars($identifiant)); $sql->execute(); $result = $sql ->fetchAll(PDO::FETCH_ASSOC); @@ -51,4 +51,66 @@ function validationIdentifiants($pdo,$identifiant,$mdp) { return false; } +function initValeursSession($result) { + $_SESSION['id_utilisateur'] = $result[0]['id']; + $_SESSION['pseudo_utilisateur'] = $result[0]['utilisateur']; + $_SESSION['nom_utilisateur'] = $result[0]['nom_complet']; + $_SESSION['privilege_utilisateur'] = $result[0]['privilege']; + $_SESSION['pseudo_connexion_utilisateur'] = $result[0]['utilisateur']; +} + +function creerCookie($result) { + $cookie_params = array ( + 'expires' => time() + 60*60*24*30, + 'path' => '/', + 'domain' => $_SERVER['HTTP_HOST'], + 'secure' => false, // Mettre à true en prod (PENSER À LE FAIRE DANS deconnexion.php ET "Prolongement de la durée du cookie" AUSSI !) + 'httponly' => true, + 'samesite' => 'Strict' + ); + setcookie('souvenir-session', htmlspecialchars($_SESSION['pseudo_utilisateur']).'|--@--|'.hash('sha3-512', $result['0']['id'].$result['0']['utilisateur'].$result['0']['mot_de_passe']), $cookie_params); +} + +function validationCookie($pdo) { + if (isset($_COOKIE['souvenir-session'])) { + if (!isset($_SESSION['id_utilisateur'])) { + $donnees_cookie=explode('|--@--|', $_COOKIE['souvenir-session']); + try { + $req = 'SELECT * FROM postfix_utilisateurs WHERE utilisateur=:identifiant'; + + $sql = $pdo->prepare($req); + $sql->bindValue(':identifiant', htmlspecialchars($donnees_cookie['0'])); + $sql->execute(); + + $result = $sql ->fetchAll(PDO::FETCH_ASSOC); + $comptage = count($result); + + } + catch(PDOException $e) { + die ("Erreur lors du traitement de la requête : " . $e->getMessage()); + } + + if ($comptage == 1) { + if (hash('sha3-512', $result['0']['id'].$result['0']['utilisateur'].$result['0']['mot_de_passe'])===$donnees_cookie['1']) { + // Cookie valide. On initialise les variables de sessions pour le bon fonctionnement du site. + initValeursSession($result); + } + else { + // Cookie invalide (probablement modifié par l'utilisateur). + return false; + } + + return $result; + } + else + return false; + } + // Prolongement de la durée du cookie + setcookie('souvenir-session', $_COOKIE['souvenir-session'], ['expires' => time() + 60*60*24*30, 'path' => '/', 'domain' => $_SERVER['HTTP_HOST'], 'secure' => false, 'httponly' => true, 'samesite' => 'strict']); + } + else + return false; + +} + ?> \ No newline at end of file diff --git a/services/traitements/utilisateurs/deconnexion.php b/services/traitements/utilisateurs/deconnexion.php index 2b20630..810d91a 100644 --- a/services/traitements/utilisateurs/deconnexion.php +++ b/services/traitements/utilisateurs/deconnexion.php @@ -11,9 +11,11 @@ if (!empty($_GET['succes'])) { $succes=$_GET['succes']; } // Destruction des variables de la session -session_unset (); +session_unset(); // Destruction de la session -session_destroy (); +session_destroy(); +//Destruction du cookie de maintient de session +setcookie('souvenir-session', '', time() - 3600, '/', $_SERVER['HTTP_HOST'], false, true); // Nous sommes obligés de passer par la variable transitoire $succes car le session_unset détruit $_GET... if (!empty($succes)) { header('location: /pages/visiteurs/formulaire_accueil.php?succes='.$succes); diff --git a/services/traitements/utilisateurs/identification.php b/services/traitements/utilisateurs/identification.php index 23e2b51..9f765f3 100644 --- a/services/traitements/utilisateurs/identification.php +++ b/services/traitements/utilisateurs/identification.php @@ -17,14 +17,15 @@ if (isset($_POST['identifiant']) && isset($_POST['mdp']) && !empty($_POST['ident $result = validationIdentifiants($pdo,$_POST['identifiant'],trim($_POST['mdp'])); if($result) { - $duree_session=2592000; - session_set_cookie_params($duree_session); session_start(); - $_SESSION['id_utilisateur'] = $result[0]['id']; - $_SESSION['pseudo_utilisateur'] = $result[0]['utilisateur']; - $_SESSION['nom_utilisateur'] = $result[0]['nom_complet']; - $_SESSION['privilege_utilisateur'] = $result[0]['privilege']; - $_SESSION['pseudo_connexion_utilisateur'] = $result[0]['utilisateur']; + initValeursSession($result); + + /** + * Création d'un cookie permettant le maintient de session si l'utilisateur a coché la case "Se souvenir de moi". + */ + if (isset($_POST['souvenir-session']) && $_POST['souvenir-session']==="on") { + creerCookie($result); + } if (isset($_SESSION['pseudo_utilisateur']) && !empty($_SESSION['pseudo_utilisateur']) && $_SESSION['privilege_utilisateur']==="administrateur") { header ("location: /pages/gestion/administration.php?message=bienvenue&page=accueil"); @@ -38,7 +39,6 @@ if (isset($_POST['identifiant']) && isset($_POST['mdp']) && !empty($_POST['ident echo "Ça ne devrait pas arriver."; die(); } - } else { header('Location: /pages/visiteurs/echec_auth.php');