par
naholyr » 27 févr. 2006, 15:31
Toute tentative de gestion des session côté client sera au mieux buggée, au pire non sécurisée.
Pour éviter les "fantomes" (c'est le terme employé pour les sessions terminées mais que le serveur croit toujours ouverte, ce qui arrive parfois sur IRC si vous pratiquez un peu), le seul moyen c'est un timeout de session.
Il faut gérer côté serveur une variable "dernière fois que l'utilisateur X a été vu actif" (typiquement dans la table "users" de la base de données). Si ça date de plus de X minutes, on considère l'utilisateur comme déconnecté. Bien sûr il faut que X soit supérieur au session_timeout du php.ini sinon on prend le risque qu'un utilisateur puisse ouvrir plusieurs sessions (il aura été considéré comme déconnecté par le serveur alors qu'il ne l'est pas réellement puisque la session est toujours active).
Concrètement en très court :
// au début d'index.php
session_start();
if ($_SESSION['connected']) {
// on met à jour la dernière fois qu'il a été vu actif
mysql_query('UPDATE users SET dernieractif = NOW() WHERE username = "'.$_SESSION['username'].'"');
}
// dans login.php
$res = mysql_query('SELECT 1 FROM users WHERE DATE_ADD(dernieractif, INTERVAL '.$timeout.' MINUTE) > NOW() AND username = "'.$_POST['username'].'"';
if (mysql_num_rows($res) > 0) {
die('vous êtes déjà connecté');
}
// dans logout.php
mysql_query('UPDATE users SET dernieractif = "0000-00-00 00:00:00" WHERE username = '.$_SESSION['username']);