prepare($req); $sql->bindValue(':identifiant', htmlspecialchars($identifiant)); $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) { /* * Les paramètres de la fonction crypt de $mot_de_passe_form sont composés du mot de passe issue du formulaire accueil ainsi que du sel. * Les signes dollars sont des séparateurs. $mot_de_passe_base[1]=6=SHA512. $mot_de_passe_base[2]=au sel du mot de passe contenu dans la base. * Les paramètres de sel sont issus du mot de passe haché contenu dans la base. * L'opération de vérification s'adapte ainsi automatiquement aux algoritmes utilisés par Dovecot lors du hachage du mot de passe utilisateur. */ $mot_de_passe_base=explode('$', $result['0']['mot_de_passe']); $mot_de_passe_form=crypt(trim("$mdp"), "$".$mot_de_passe_base[1]."$".$mot_de_passe_base[2]."$"); if ("$".$mot_de_passe_base[1]."$".$mot_de_passe_base[2]."$".$mot_de_passe_base[3]!=$mot_de_passe_form) { // Si le mot de passe renseigné n'est le bon, le visiteur est redirigé vers la page d'accueil avec un message explicatif header('Location: /pages/visiteurs/echec_auth.php'); die(); } return $result; } else return false; } /* * Fonction d'initialisation des valeurs de session. * Elle utilise les informations de l'utilisateur en base de données pour initialiser une session personnalisée. */ 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']; } /* * Fonction de création d'un cookie de connexion automatique. * Si la case "Se souvenir de moi" est cochée au formulaire de connexion, un cookie d'une durée d'un mois est créé. */ function creerCookie($result) { $cookie_params = array ( 'expires' => time() + 60*60*24*30, 'path' => '/', 'domain' => $_SERVER['HTTP_HOST'], 'secure' => false, // Mettre à true pour ne le créer qu'en HTTPS (le faire également dans "deconnexion.php" et au commentaire "Prolongement de la durée du cookie." plus bas). '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); } /* * Fonction de validation du cookie de connexion automatique. * Vérifie la légitimité du cookie de connexion de l'utilisateur via les informations en base de données. * Si légitime, une session PHP est initialisée et le cookie est renouvelé pour un mois supplémentaire. * Si non légitime, la fonction ne fait rien. Le comportement du site s'en remet alors à la seule existence d'une session PHP. */ 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; } ?>