====== Gestion de session solide ====== Beaucoup de gestions de sessions en php me semblent mal faites et dangereuses. Voici un exemple de gestion de session créé par mes soins et qui me semble bien plus sûre (Si vous voyez des failles, n'hésitez pas à m'en faire part). Buts: Simplicité, solidité. Dans cet exemple, le login/mot de passe est codé en dur (toto/titi). A vous d'adapter pour taper dans LDAP, une base mySQL ou autre. Caractéristiques: * On ne fait **aucune** confiance aux données client (pas même à la date d'expiration du cookie de session). Tout est stocké côté serveur ($_SESSION). * Toute page devant être protégée doit juste inclure ''include 'session.inc'; check_login();''. Tout accès non autorisé redirige automatiquement vers la page de login. * La session expire automatiquement en cas d'inactivité de l'utilisateur (La date de dernière activité est automatiquement mise à jour à chaque affichage de page). * Protection contre le vol de cookie de session (session hijacking tel que Firesheep): A chaque appel de page, on vérifie que l'adresse IP du client n'a pas changée. Le cas de multiples utilisateurs derrière le même proxy (même IP) est pris en compte. * Une clé secrète unique aléatoire est générée côté serveur (et jamais envoyée). Elle peut servir pour signer les formulaires (HMAC) ou générer des token de formulaires (protection contre XSRF). Voir ''$_SESSION['uid']''. * L'utilisation de phpsessionID dans l'URL est bloquée. Améliorations possibles: * Ajouter une captcha pour empêcher les attaques brute force. * Contrôler que le ''User-Agent'' n'a pas changé. * En cas d'accès non autorisé à une page, rediriger vers cette page après le login. * Améliorer la sécurité du cookie de session: * Limiter le cookie à un chemin précis et/ou à un sous-domaine précis. * Si vous êtes en SSL, passer le cookie en mode "Secure" pour qu'il ne soit plus transmis en HTTP. * Supprimer le cookie de session côté client pour faire plus propre (même si du point de vue sécurité cela n'a //aucune// importance étant donné que cette session est expirée coté serveur et donc inutilisable). * Effectuer régulièrement des changements de cookie de session ? (Voir même à chaque requête). (Est-ce que cela rend le piratage plus complexe ?) La page de login: Login
Please login:
Login :
Password :
La page de logout: Une page-type accessible uniquement si l'utilisateur est logué: Index Hello , you are logged in.
Logout
Et enfin la gestion de session elle-même: =$_SESSION['expires_on']) { logout(); } $_SESSION['expires_on']=time()+INACTIVITY_TIMEOUT; // User accessed a page : Update his/her session expiration date. } function logout() // Force logout, redirect to login page. { unset($_SESSION['uid'],$_SESSION['ip'],$_SESSION['expires_on']); // Delete server-side session info header('Location: login.php'); exit(); // We do not bother deleting the phpsessionID cookie, because it can't be used anyway (All server-side // data attached to this session cookie is deleted. This makes the cookie useless. ) } ?> Si vous avez des remarques, idées, critiques: ~~DISCUSSION:closed~~