Gérer les sessions par la base de données
Le but de cette page est d'envisager une solution afin d'utiliser une base de données (par exemple
MySQL mais la solution devrait pouvoir évoluer si
WikiNi gère un jour d'autre SGBD's) pour y stocker les variables de sessions de l'utilisateur.
Intérêt
Gérer les sessions via la base de données permet d'avoir un meilleur contrôle sur ces données. Lorsque l'on laisse php gérer les sessions, on ne sait a priori pas comment il fait, et même en supposant qu'il les gère par des fichiers (configuration par défaut), on ne sait a priori pas non plus où ces fichiers sont stockés. Il est dès lors impossible de travailler sur le contenu des sessions des autres visiteurs (toujours présents ou non).
Gérer les sessions par la base de données permet de le faire, ce qui peut être très utile pour
- Récupérer des données au moment où une session devient périmée et doit donc être détruite. On peut par exemple envisager de stocker des informations sur le temps passé en ligne, le nombre de pages vues etc.
- Obtenir des informations sur les autres utilisateurs en ligne, ce que propose l'action WhoIsOnline.
- Réinitialiser des sessions:
- Un utilisateur pourrait consulter toutes les sessions ouvertes actuellement sous son nom (comme sur Gna! je pense -- LordFarquaad) et éventuellement en supprimer une ou plusieurs s'il soupsonne un utilisateur malveillant
- Un administrateur pourrait vouloir fermer les sessions d'un ou plusieurs utilisateur(s) en ligne pour les éjecter (problème de sécurité, de spam etc.). PhpBB? propose cette fonctionnalité (sauf erreur de ma part -- LordFarquaad)
Proposition de solution
Cette solution a été développée en parrallèle avec l'
action WhoIsOnline. Elle stocke ainsi en base de données:
- L'identifiant de session
- L'adresse IP du visiteur (afin de renforcer la sécurité: il est ainsi beaucoup plus difficile d'usurper la session d'un autre utilisateur en réutilisant sont identifiant)
- Le nom de l'utilisateur
- La dernière page vue
- La méthode (handler) de vision de la dernière page
- L'heure de la dernière action de l'utilisateur
- Le nombre de pages vues
ChangeLog
2006-01-17
- version: 0.1.1
- nouveautés:
- correction d'un bug/faille de sécurité lié aux apostrophes contenues dans les données de la session (conduisant généralement à l'échec de la sauvegarde de la session mais pouvant potentiellement être utilisée pour faire de l'injection MySQL)
- compatibilité PHP > 5.0.5 (j'ignore si avant ça marchait pas, mais en tout cas maintenant ça devrait marcher)
- mise en oeuvre: remplacez l'ancien fichier session.php par le nouveau
2005-04-12
- version: 0.1.0
- première version
Instructions d'installation
(ces instructions se trouvent également dans le fichier instructions.txt fourni avec l'archive proposée ci-après)
IMPORTANT: Faites toujours une copie de sauvegarde de vos fichiers et de votre base de données avant de les modifier !
- Téléchargez le fichier sessions.php disponible à l'adresse: http://wikinicontrib.notredomaine.org/SessionsInDataBase-v.0.1.1-2006-01-17.zip et placez-le à la racine de votre wiki. Ce fichier est également disponible à la page GererLesSessionsEnBaseCodeSessionsPhp.
- Exécuter la requête SQL suivante, sans oublier de modifier le nom de la table 'wikini_sessions' si besoin :
(si la variale table_prefix de votre fichier wakka.config.php est différente de wikini_, pensez à créer une table qui porte le bon préfixe en changeant le nom de la base après CREATE TABLE, sinon le nom de votre table ne correspondra pas à la requête faite par
WikiNi et vous aurez un beau message d'erreur)
CREATE TABLE `wikini_sessions` (
`id` MEDIUMINT( 5 ) NOT NULL AUTO_INCREMENT ,
`ip` VARCHAR( 15 ) NOT NULL ,
`session_id` VARCHAR( 32 ) NOT NULL ,
`datas` TEXT NOT NULL ,
`username` VARCHAR( 50 ) NOT NULL ,
`tag` VARCHAR( 50 ) NOT NULL ,
`handler` VARCHAR( 20 ) NOT NULL ,
`time` VARCHAR( 12 ) NOT NULL ,
`page_count` MEDIUMINT( 4 ) NOT NULL default 1,
PRIMARY KEY ( `id` ) ,
UNIQUE (
`ip` ,
`session_id`
)
);
- Ouvrir ./wakka.php et supprimer ou commenter le bout de code suivant:
// configuration du cookie de session
// determine le chemin pour les cookies
$a = parse_url($wakkaConfig['base_url']);
$CookiePath = dirname($a['path']);
// ajoute un '/' terminal sauf si on est à la racine web
if ($CookiePath != '/') $CookiePath .= '/';
$a = session_get_cookie_params();
session_set_cookie_params($a['lifetime'],$CookiePath);
unset($a);
unset($CookiePath
// start session
session_start();
- Juste avant "// go!", ajouter:
- // load session manager
- include 'sessions.php';
- Sauver/fermer, c'est fini !