Autorisation et authentification en PHP : des bases à la sécurité
Dans le développement web moderne, l'authentification (vérification de l'identité de l'utilisateur) et l'autorisation (vérification des droits d'accès) sont des mécanismes de sécurité fondamentaux. En PHP, ces processus sont implémentés via la gestion des sessions, des cookies, du hachage de mots de passe et des jetons. Dans cet article, nous aborderons tous les aspects clés nécessaires à la création d'un système de connexion sécurisé sur le site éducatif pythonlib.ru.
1. Concepts de base : authentification vs autorisation
Avant d'écrire du code, il est important de distinguer clairement ces deux termes :
- Authentification — processus de vérification que l'utilisateur est bien celui qu'il prétend être (identifiant + mot de passe, biométrie, jeton).
- Autorisation — détermination des ressources et actions accessibles à un utilisateur authentifié (rôles : administrateur, modérateur, utilisateur).
En PHP, l'authentification est généralement effectuée via des sessions ou JWT, et l'autorisation via la vérification des rôles dans la base de données.
2. Hachage de mots de passe : ne stockez jamais les mots de passe en clair
PHP fournit des fonctions intégrées pour le hachage sécurisé des mots de passe. Utilisez password_hash() et password_verify() — c'est la norme moderne.
// Inscription d'un utilisateur$password = $_POST['password'];$hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// Enregistrer $hashedPassword dans la base de données$sql = "INSERT INTO users (email, password_hash) VALUES (?, ?)";$stmt = $pdo->prepare($sql);$stmt->execute([$_POST['email'], $hashedPassword]);// Vérification lors de la connexion$inputPassword = $_POST['password'];$storedHash = $user['password_hash']; // depuis la base de données
if (password_verify($inputPassword, $storedHash)) { // Authentification réussie $_SESSION['user_id'] = $user['id'];} else { // Mot de passe incorrect}3. Gestion des sessions en PHP
Les sessions sont la méthode la plus courante pour suivre les utilisateurs authentifiés. PHP génère automatiquement un identifiant de session unique et le stocke dans un cookie.
// Démarrage de la session (toujours au début du script)session_start();
// Après une connexion réussie$_SESSION['user_id'] = $user['id'];$_SESSION['user_role'] = $user['role']; // pour l'autorisation$_SESSION['logged_in'] = true;
// Vérification de l'authentification sur les pages protégéesfunction requireAuth() { if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { header('Location: /login.php'); exit; }}
// Déconnexionsession_destroy();setcookie(session_name(), '', time() - 3600, '/');4. Sécurité des sessions : protection contre les attaques
Pour prévenir le détournement de session (Session Hijacking) et la fixation de session (Session Fixation), utilisez les mesures suivantes :
- Régénération de l'ID de session après la connexion :
session_regenerate_id(true); // supprime l'ancienne session- Vérification du User-Agent et de l'IP (facultatif mais améliore la sécurité) :
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
// À chaque requêteif ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) { session_destroy(); die('Activité suspecte');}- Définition des indicateurs pour le cookie de session dans
php.iniou viasession_set_cookie_params():
session_set_cookie_params([ 'lifetime' => 0, // jusqu'à la fermeture du navigateur 'secure' => true, // HTTPS uniquement 'httponly' => true, // inaccessible depuis JavaScript 'samesite' => 'Strict' // protection contre CSRF]);session_start();