Comprendre les vulnérabilités sessions courantes
Avant d’appliquer des correctifs, il est indispensable de connaître les menaces qui ciblent vos applications. Les deux attaques les plus fréquentes sont le vol de session (Session Hijacking) et la fixation de session. Dans le premier cas, un attaquant dérobe l’identifiant de l’utilisateur légitime. Dans le second, il force la victime à utiliser un identifiant qu’il contrôle déjà.
Appliquer les bonnes pratiques de configuration
La première ligne de défense pour la sécurité sessions PHP se configure directement avant le démarrage de la session. L’objectif est de restreindre au maximum l’accès au cookie de session.
<?php ini_set('session.cookie_httponly', 1); ini_set('session.cookie_secure', 1); ini_set('session.use_strict_mode', 1); session_set_cookie_params([ 'samesite' => 'Strict' ]); session_start(); ?>
Voici quelque explications:
| Directive | Avantage de sécurité |
|---|---|
| cookie_httponly | Empêche la lecture du cookie via JavaScript, limitant les impacts d’une faille XSS. |
| cookie_secure | Exige une connexion HTTPS pour transmettre le cookie. |
| use_strict_mode | Empêche l’utilisation d’un identifiant de session non initialisé par le serveur. |
Assurer la protection session fixation
Lorsqu’un utilisateur s’authentifie, son niveau de privilège change. C’est le moment critique où une attaque par fixation peut aboutir. La parade absolue consiste à générer un nouvel identifiant immédiatement après la connexion réussie.
<?php
// Après validation du mot de passe
session_regenerate_id(true);
$_SESSION['user_id'] = $user_id;
$_SESSION['logged_in'] = true;
?>Gérer l’expiration et l’inactivité
Une session infinie augmente considérablement la surface d’attaque. Il est recommandé de programmer une déconnexion automatique après une période d’inactivité.
<?php
$timeout_duration = 1800; // 30 minutes
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity']) > $timeout_duration) {
session_unset();
session_destroy();
header('Location: /login.php?expired=1');
exit;
}
$_SESSION['last_activity'] = time();
?>Les erreurs à éviter lors de la déconnexion
Une erreur classique en gestion sessions PHP consiste à vider simplement le tableau global sans détruire physiquement la session et son cookie associé. Voici la procédure complète et sécurisée pour déconnecter un utilisateur.
<?php
session_start();
$_SESSION = [];
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
?>

