Comment éviter de multiples connexions au site web PHP
Je veux éviter de multiples connexions dans une application php.
D'abord, je crée un état de connexion (actif, notactive) dans une table utilisateur.
Lorsque l'utilisateur se connecte dans le statut de l'utilisateur sera réglé sur "actif", et si l'utilisateur se déconnecte, le statut sera mis à 'notactive'. Lorsqu'un autre client essaye de se connecter en utilisant le même compte utilisateur, je vérifie la table user. Si l'utilisateur est toujours actif l'erreur de connexion vous sera envoyé à l'utilisateur.
Le problème s'est produit, si l'utilisateur ferme le navigateur, le statut de l'utilisateur table peut être mise à jour car l'utilisateur n'a pas cliquez sur déconnexion.
Avez-vous une suggestion à ce sujet?
OriginalL'auteur Adi Sembiring | 2009-11-13
Vous devez vous connecter pour publier un commentaire.
(Veuillez noter que, si la technique est encore un peu en cours de validité; le PHP échantillons ne doivent pas être copiés mot à mot il y a de plus sûr moyen de l'intégration de l'utilisateur fourni des valeurs dans une requête SQL)
Au lieu de les stocker si l'utilisateur est actif\inactif, il est préférable de les stocker de certains attributs qui peuvent être vérifiées par l'utilisateur sur une base par action de base; que, chaque fois que l'utilisateur essaie de faire quelque chose qui nécessite une authentification, il va vérifier pour voir que cet attribut correspond avant le produit.
Je vous recommande de faire ce qui suit;
Tout d'abord, créez une table de hachage pour identifier l'utilisateur à chaque fois qu'ils se connectent. J'imagine qu'un
sha1
detime()
serait suffisant pour éviter les collisions. Quoi que vous choisissiez, assurez-vous qu'il est assez variée pour qu'un autre utilisateur, l'enregistrement ne sera ont une faible chance de recevoir le même hachage (par exemple, ne pas hash de l'adresse IP ou le user-agent du navigateur, car elles ne sont pas assez variés).Deuxième, de stocker cette valeur de hachage dans votre base de données et l'utilisateur session au moment de l'enregistrement. Le faire efficacement "log out" de l'utilisateur précédent, comme le hachage doit être différente à chaque fois que quelqu'un se connecte.
Puisque nous sommes à l'aide de sessions, un cookie doit être placé automatiquement dans le navigateur de l'utilisateur qui contient un IDENTIFIANT unique qui identifie l'utilisateur de ses données de session. Le contenu du cookie ne sont pas vraiment de souci.
Ensuite, créez une fonction appelée
authenticateUser()
ou similaire, qui sera appelée au début de chaque script pour s'assurer que l'utilisateur est authentifié. Ce script doit interroger la base de données, de vérifier si un utilisateur avec votre ID de l'utilisateur a une table de hachage qui correspond à votre utilisateur de hachage.Par exemple:
Ensuite, il nous suffit de passer
authenticateUser()
de l'utilisateurID
,hash
(par vos données de session) et undatabase link
(pour une connexion de base de données, vous devez avoir ouvert plus tôt).Si
authenticateUser()
retournetrue
, l'utilisateur est authentifié. Sifalse
, l'utilisateur n'est pas OU de la base de données n'est pas disponible ou il y a une erreur SQL.Veuillez noter que cela va augmenter la charge de votre serveur comme une demande de base de données est envoyé une fois par demande de page. Il n'est probablement pas sage de le faire sur le géant de projets où des milliers de personnes se connectent à un moment donné. Je suis sûr que quelqu'un peut suggérer des améliorations.
Aussi, dans l'attente de l'expiration du cookie n'est pas la meilleure façon de forcer les personnes qui ont été inactifs pour vous déconnecter, vous ne devriez jamais faire confiance à des cookies. Au lieu de cela, vous pouvez ajouter une colonne appelée
last_active
qui vous pouvez mettre à jour à chaque fois que l'utilisateur est authentifié. Cela permettra également d'augmenter la charge du serveur, mais vous permettra de remplacer manuellement rassis log-ins en retrait de lahash
pour les utilisateurs qui ont été, disons, inactif pendant 3 heures.J'imagine que pourrait être tout aussi approprié. Ne devrait pas être trop dur à tester aussi, de vous connecter à partir d'un certain nombre de dispositifs et de regarder pour voir que les bons ne sont pas en session.
Voir ma réponse ci-dessous sur la façon d'éviter l'accès de base de données / chargement du serveur d'émission.
ce qui se passe quand l'utilisateur directement à la fermeture du navigateur et de la session de détruire?
ma question est également de même @Nilesh patel, qui peut empêcher l'utilisateur de se connecter à tous les temps.
OriginalL'auteur Lachlan McD.
Ce que vous devez faire est de vérifier qu'ils ont été actifs depuis plusieurs minutes lors de la tentative de connexion.
Cela pourrait être fait avec un lastonline timbre et doit être défini sur chaque demande de page dans la table user.
Si ne pas fait avec javascript, vous pouvez vérifier, lors de la connexion, si l'utilisateur a été actif au cours des 15 dernières minutes. Si non, vous pouvez vous connecter en tant que nouvel utilisateur.
Vous pouvez aussi le faire avec du javascript. Faire un appel ajax qui se déclenche toutes les minutes environ.
Laisser cet appel aller à un script qui va modifier la lastonline timbre dans la base de données utilisateur.
Lors de la tentative de connexion, vous vérifiez la base de données utilisateur si le lastonline timbre a dépassé la minute et vous avez votre vérifier si vous pouvez vous connecter. Cela vous aidera lorsque vous êtes sur la page mais vous ne sont pas actifs des 15 dernières minutes, et vous ne voulez pas que quelqu'un d'autre pour vous connecter.
Je n'étais pas la downvoter, mais avoir JavaScript côté client est en aucun cas une garantie que les visiteurs pourront être déconnecté au bout de 60 secondes. Aussi voyons ce qui se passe si l'utilisateur ferme la page.
Je vais un peu d'aide complet. mais, Comment, si l'utilisateur de résilier le navigateur ???
cette méthode ne fonctionne que si vous êtes sur la page. si la page se ferme de l'appel ajax est détruit. après une minute, un autre utilisateur peut se connecter à un autre endroit.
Cette solution est la meilleure solution que j'ai trouvé ici
OriginalL'auteur Robert Cabri
Voici une solution qui n'est pas besoin constant accès à la base de de travail...
(ce qui permettra d'éviter la nécessité de vérifier la session_id() contre la valeur de base de données chaque fois que vous demandez/actualiser une page, le soulagement de la db/serveur de stress)...
1. Sur connexion, saisir la pré-existant session_id stockées dans la base de données pour cet utilisateur et ce faire:
2. Le début d'une nouvelle session et enregistrer cette nouvelle session_id à la base de données, en écrasant la précédente. Cela permettra de déconnexion de la session précédente sur cet utilisateur, si il est actif (effet de déconnecter l'autre gars à l'aide de ce compte).
Lui donner un essai et laissez-moi savoir si ce n'est l'affaire!!
mais qu'en est session_regenerate_id() la fonction? parce que j'ai utilisé que de manière régulière? il semble donc que je dois enregistrer/mettre à jour régénéré id de base de données et ainsi fait le même stress db à droite?
OriginalL'auteur prograhammer
Vous pourriez changer votre modèle, de sorte que seuls les plus récentes de l'utilisateur peut être connecté.
Si vous avez enregistré le plus récent id de session observée pour chaque utilisateur, lorsqu'ils ouvrent une session dans un deuxième temps, vous pouvez corbeille en cours de session existante, de manière efficace de journalisation.
Pour un utilisateur normal, les choses semblent "fonctionne". Si vous êtes désireux de prévenir les "anormaux" utilisateurs de la distribution de leurs identifiants de connexion, cela devrait servir comme un frein.
When an account still active, another people cant login to the website by using the same user
et, le problème est survenu. Si l'utilisateur de résilier le navigateur. le navigateur ne peut pas être envoyer des données au serveur pour effectuer la déconnexion de l'action.Ainsi, l'état est toujours active même si l'utilisateur n'est plus active.Eh bien, ce que je veux dire c'est que quand user_b'journaux, user_A est automatiquement déconnecté. Il y a peut-être une bonne raison pourquoi vous voulez éviter user_b'de connexion, mais vous n'êtes pas clair pourquoi c'est préférable. Ma suggestion permet de contourner le problème de l'attente d'un délai d'expiration de session pour permettre la ré-ouverture de session, tout en empêchant un utilisateur de se connecter à deux fois.
OriginalL'auteur Paul Dixon
Vous avez besoin pour créer un ID unique et la stocker dans une base de données. Ce que j'ai fait a été de créer un trop. - Je ranger dans une variable de session et de l'utiliser pour éviter le détournement de session et un autre dans une base de données pour empêcher les connexions multiples. Le code suivant va créer un ID unique:
Si l'ID unique ne correspond pas, il vous suffit de déconnecter l'utilisateur.
OriginalL'auteur Dan Bray
À l'aide de code javascript coté client afin de faire le suivi de l'utilisateur connecté n'est pas fiable.
Vous pouvez obtenir le même résultat en créant tout simplement un lastlogindate champ dans la base de données, et de la mettre à jour avec le timestamp de la dernière connexion de l'utilisateur.
À chaque tentative de connexion, si maintenant()-$lastlogindate > predefined_timeout, alors vous devez les accepter le nouveau login, sinon la refuser.
OriginalL'auteur yann.kmm