Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/09/2007, 01h01   #1
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 427
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 427
Points : 304
Points : 304
Par défaut Détruire une session lorsqu'un même login se reconnecte

Bonjour!

Bon je me tire les cheveux depuis un moment maintenant sur un problème que je pensais simple.

Je veux éviter sur mon site que deux entitées soient connectées sur un même compte (même login). Donc ni une ni deux, j'ai rajouté dans ma table utilisateur une colonne id_session lorsque l'utilsateur se connecte selon un login A, le champ est mis à jour avec sa session et si un second utilisateur se connecte avec le login A, j'aimerais que le premier soit déconnecté (session vidée).

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$id_session = session_id();
$request = "SELECT id_session 
FROM users
WHERE id_player=".$id;
$resultSession = pg_query($request);
$sessionInfo = pg_fetch_assoc($resultSession);
if ($sessionInfo['id_session'] != null){
	session_id($sessionInfo['id_session']);
	$_SESSION = array();
	session_destroy();
	session_id($id_session);
}
Bien entendu ça ne marche pas, je me retrouve déconnecté à tous les coups...

J'ai essayé plusieurs méthodes, mais à chaque fois le comportement des sessions est totalement erratique et pour tout dire à mon sens assez inexplicable.

Quelqu'un saurait m'éclairer?
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 01h09   #2
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
Bonjour,

Utilise session_regenerate_id(true)

session_regenerate_id()
va remplacer l'identifiant de session courant par un nouveau, généré automatiquement, tout en conservant les valeurs de session.

en paramètre :
delete_old_session
Si l'on doit effacer l'ancien fichier de session associé ou pas. Par défaut, FALSE. Voir DOC PHP
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 09h57   #3
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 427
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 427
Points : 304
Points : 304
Ca ne marche pas:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
$request = "SELECT id_session 
FROM users
WHERE id_player=".$id;
$resultSession = pg_query($request);
$sessionInfo = pg_fetch_assoc($resultSession);
if ($sessionInfo['id_session'] != null){
	session_id($sessionInfo['id_session']);
	session_regenerate_id(true);
}
$id_session = session_id();
 
session_start();
J'avais mal positionné le session_start(), mais en le mettant après, ça ne détruit aucune session.

Edit: oui donc avec cette méthode j'en reviens au comportement erratique à savoir:

Aucune des deux sessions n'est détruite, mais en fait la même session est partagée par les deux postes, ainsi si je ferme la session d'un côté, de l'autre, elle est détruite aussi, et chose plus étrange si je me déconnecte d'un côté et de l'autre et que je me reconnecte, l'autre se retrouve reconnecté dans le même temps...
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 11h29   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Personnellement je ne comprends pas votre système : votre identifiant de session n'est, semble-t-il, pas mis à jour dans votre base de données donc à quoi bon en régénérer un nouveau ? De plus, je pense que les appels session_start et session_id sont mal utilisés : session_id doit être appelé avant pour fixer l'identifiant et, logiquement, après pour obtenir l'identifiant courant (surtout si la session n'a pas encore été créée).

Vous devriez éventuellement regarder la méthode présentée dans le tutoriel : Utiliser une base de données pour sécuriser vos sessions.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 11h43   #5
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 427
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 427
Points : 304
Points : 304
J'ai déjà regardé ce tutoriel, mais c'est largement trop 'compliqué' pour l'utilisation que je veux en avoir.

Pour ce qui est de l'exemple donné, effectivement il manque une partie du code où je réinsère dans la base le nouvel ID

Code :
$request = "UPDATE users SET id_session='".$id_session."' WHERE id_player=".$id;
De plus j'ai effectivement modifié cet aspect du code en changeant de place les deux:

Code :
1
2
3
4
5
6
7
8
9
10
11
$request = "SELECT id_session 
FROM users
WHERE id_player=".$id;
$resultSession = pg_query($request);
$sessionInfo = pg_fetch_assoc($resultSession);
if ($sessionInfo['id_session'] != null){
	session_id($sessionInfo['id_session']);
	session_regenerate_id(true);
}
session_start();
$id_session = session_id();
Mais ça donne le comportement décrit plus haut à savoir une téléscopation des deux sessions...

Il serait largement plus simple de pouvoir détruire une session à partir d'un id sans avoir à se positionner sur cette session...
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 14h07   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par Linio
Il serait largement plus simple de pouvoir détruire une session à partir d'un id sans avoir à se positionner sur cette session...
Les sessions ne sont pas directement prévues pour cela et je déconseille de toucher directement aux fichiers de session. Il manquerait une information, au moins, pour faire en sorte que les précédentes sessions ne puissent reprendre la main. L'idée étant non pas d'invalider les précédentes sessions depuis la dernière mais qu'elles le soient d'elles-mêmes lors d'une nouvelle requête avec celles-ci (un timestamp en base reflétant la mise à jour de l'identifiant et un en session pour la dernière activité, l'adresse IP, le navigateur, ... ?).

C'est ce qui est proposé dans le tutoriel puisque le navigateur et l'adresse IP permettent d'identifier l'utilisateur, sa connexion en cours disons. Chaque méthode présente des avantages et des inconvénients notamment en terme d'accessibilité.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 17h40   #7
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 427
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 427
Points : 304
Points : 304
L'idée étant de fait de dire en cas d'une nouvelle 'action' de la part de l'utilisateur de le déconnecter en vérifiant les données en base, cela étant ça pose plusieurs problèmes, le plus important pour moi étant l'alourdissement quand même conséquent du nombre de requête 'juste' pour ça...

Je trouve dommage de faire des requêtes à chaque action multipliées par le nombre d'utilisateurs pour une simple vérification qui je pensais pouvait se faire à la connection...

Je vais voir à mettre une solution en place sur l'id lors de l'affichage des pages, on va bien voir...
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h55.


 
 
 
 
Partenaires

Hébergement Web