2010-04-29 4 views
0

J'ai implémenté une interface de session basée sur mysql dans php. Je viens de découvrir que si je me connecte à mon compte en utilisant le navigateur A (par exemple Chrome) et que je me connecte au même compte dans un autre navigateur B (par exemple IE), 2 identifiants de session sont assignés à chaque navigateur. Comment puis-je faire en sorte que lorsque je me reconnecte en utilisant le navigateur B, je conserve la session active du navigateur précédent A? Le problème est que je stocke certaines informations dans la session et que les données ne sont pas synchronisées entre les mêmes utilisateurs dans différents navigateurs et que cela provoque des dégâts. : Smême utilisateur connecté affecté différents identifiants de session (dans différents navigateurs)

Existe-t-il un moyen d'y parvenir?

Merci!

Répondre

2

Si vous stockez la session dans la base de données, ajoutez un mécanisme par lequel userId est stocké dans l'enregistrement de session de votre base de données, créant ce que j'appelle une "session sémantique". Lorsque l'utilisateur se connecte, vérifiez si une autre session existe déjà; si c'est le cas, utilisez session_id() pour fixer la nouvelle session à l'ID de l'ancienne session, qui les rejoindra (et devrait changer l'ID de votre nouvelle session pour toutes les demandes suivantes). Assurez-vous de ne réaliser cette action que pendant l'étape de connexion, sinon vous pourriez vous retrouver avec des conditions de course effrayantes de deux sessions essayant d'être l'une et l'autre et de "permuter".

+0

merci! Im en utilisant le script dbsession pour gérer mes sessions. Comment puis-je détecter si l'ID utilisateur est déjà stocké dans le cadre d'une autre session active dans l'enregistrement de session de la base de données? Je stocke l'ID utilisateur de l'utilisateur dans $ _SESSION ['userid'] mais cela apparaît sous l'enregistrement de la table session_data. – Lyon

+0

vous devrez modifier le schéma de la table qui stocke les données; ma table de session, par exemple, est configurée avec les colonnes suivantes: 'sessid, userId, lastIp, sessData, sessBegan, sessLast'. Pour ce faire, vous n'avez besoin que de la clé de la colonne userId. Cela nécessitera une personnalisation de votre moteur de stockage de session. – Dereleased

+0

merci. J'ai réussi à modifier mon schéma de table et mon moteur de stockage de session. on pense que je me suis rendu compte après avoir fait cela ... je ne peux pas régénérer l'identifiant de session lors de la connexion maintenant. Si je fais cela, il se déconnectera des autres navigateurs. est-ce un risque de sécurité maintenant? – Lyon

1

Ne stockez pas les données en session, stockez-les dans la base de données.

+0

la session est stockée dans la base de données. mais comme je veux réduire le nombre d'appels à la base de données, j'enregistre certains dans la session. par exemple. la session contient des informations à des fins de lecture. donc je n'ai pas besoin d'appeler à nouveau la base de données pour obtenir ces données. à la place, seuls les appels de mises à jour/insertions sont effectués. – Lyon

+0

Si vous souhaitez réduire les appels db, enregistrez ces données dans un cache. Le stockage de session n'est pas une sorte de cache par défaut. –

0

Les sessions sont normalement identifiées par des cookies, qui ne sont visibles que dans un navigateur. Vous pouvez probablement utiliser Flash pour partager l'identifiant de session entre les navigateurs, mais je ne peux pas penser à un cas d'utilisation. Le but de la session est de stocker des données liées à une seule session de navigation, et non à l'utilisateur en général. Vous devez utiliser une base de données ou une autre forme de stockage côté serveur pour les données utilisateur génériques.

+0

J'utilise la base de données pour stocker des données génériques mais je stocke également des données statistiques de base dans la table de session. Ainsi, lorsque l'interrogation ajax est effectuée, le script récupère la base de données. – Lyon

Questions connexes