Comment un site reconnaît un utilisateur connecté, puis les attaques qui visent ce mécanisme - empoisonnement de cookie (cookie poisoning), vol de session (session hijacking), fixation de session - et les parades - données en session côté serveur, identifiant régénéré, cookies HttpOnly, Secure et SameSite, HTTPS, expiration.
1Situer
Après la connexion, ce n'est plus le mot de passe qui prouve votre identité : c'est un petit identifiant rangé dans un cookie. Celui qui le possède EST vous pour le site. Les attaquants ne cherchent donc pas toujours à deviner un mot de passe : il leur suffit souvent de voler, de fabriquer ou d'imposer ce jeton.
2Comprendre
Voler un cookie de session, et s'en protéger
Après la connexion, le serveur donne au navigateur un cookie PHPSESSID : c'est le badge de la session.
1 / 4
Comment le site se souvient de vous
Rappel du module 07 : après la connexion, PHP range les informations dans une session sur le serveur, et le navigateur reçoit un cookie PHPSESSID qui contient seulement un identifiant aléatoire. À chaque requête, ce cookie est renvoyé et désigne la bonne session.
Trois attaques en découlent : fabriquer une fausse information dans un cookie, voler le jeton, ou imposer un jeton connu.
Le cookie poisoning
Le vol de session (session hijacking)
Les moyens les plus courants :
un XSS qui lit document.cookie et l’envoie au pirate (leçon A.4) ;
l’écoute d’un réseau non chiffré (Wi-Fi public d’un café, site en HTTP) ;
un identifiant qui fuit dans une URL (page.php?PHPSESSID=...), donc dans l’historique et les journaux ;
un logiciel espion sur le poste de la victime.
Parades : cookie HttpOnly (illisible par JavaScript), Secure et site entièrement en HTTPS, sessions qui expirent après inactivité, et déconnexion réelle (session_destroy()).
La fixation de session
La parade tient en une ligne, juste après la vérification du mot de passe :
session_regenerate_id(true); // nouvel identifiant, l'ancien est supprimé
Le cookie de session bien réglé
Option
Effet
Protège contre
HttpOnly
JavaScript ne peut pas lire le cookie
vol par XSS
Secure
envoyé uniquement en HTTPS
écoute du réseau
SameSite=Lax
pas envoyé par les requêtes venant d’autres sites (sauf un simple lien)
CSRF
durée courte + expiration côté serveur
un jeton volé ne sert pas longtemps
vol, poste partagé
Exemple simple
Le bracelet du festival
À l'entrée du festival, on montre son billet une fois et on reçoit un bracelet. Ensuite, c'est le bracelet qui ouvre les portes. Si quelqu'un vole le bracelet, ou en fabrique un faux « VIP » au feutre, les vigiles le laisseront passer, à moins de vérifier le bracelet sur leur liste.
Exemple simple
La clé prêtée
Un inconnu vous donne une clé de casier « déjà ouverte pour vous ». Vous y rangez vos affaires... mais il a gardé un double. C'est la fixation de session : l'attaquant impose un identifiant qu'il connaît.
Publicité
3Manipuler
L'espace administrateur fait confiance à un cookie role que le visiteur peut modifier. Un client connecté (amina.benali@mail.ma / Atlas2025) se donne le rôle admin avec l'outil de modification de cookie. Corrigez le site, puis renforcez la session. Compte admin : admin@soukatlas.ma / Souk2025.
Pas à pas dans le lab ↗Cliquez sur Exécuter : PHP 8.3 démarre dans votre navigateur (environ 5 Mo à télécharger, une seule fois).
La page s'affichera ici.
Le navigateur demandera /connexion.php au serveur, qui exécutera le PHP et renverra du HTML.
Entre le navigateur et le serveuraucun échange pour l'instant
Consignes 0 / 4
Un client qui se donne le cookie role=admin reçoit « Accès refusé » (403)
La vraie administratrice entre toujours : « Espace administrateur », « Bienvenue Leila »
La connexion change l'identifiant de session (nouveau Set-Cookie PHPSESSID)
Le cookie de session est HttpOnly
4Pratiquer
Exercice 1 · Les bons réglages
Écrivez le réglage du cookie de session pour un site en HTTPS : illisible par JavaScript, envoyé uniquement en HTTPS, pas envoyé par les requêtes venant d'autres sites (sauf liens simples), valable jusqu'à la fermeture du navigateur.
Voir le corrigé
<?phpsession_set_cookie_params([
'lifetime'=>0, // jusqu'à la fermeture du navigateur'path'=>'/',
'secure'=>true, // uniquement en HTTPS'httponly'=>true, // invisible pour document.cookie'samesite'=>'Lax',
]);
session_start();
Exercice 2 · Déconnexion après inactivité
Déconnectez automatiquement un utilisateur inactif depuis plus de 15 minutes.