4

我想限制同一用户从不同位置多次登录。如何识别用户在同一时间/最近时间从不同位置进行的多次登录?我认为在表格中检查一些标志和 IP 可能是一个可能的解决方案,但有没有更好的解决方案?

更新:我认为会话或 cookie 对于单台机器可能会有所帮助。就像用户第一次登录时创建一个激活密钥并存储它一样,当用户每隔一次登录到那台机器时,检查 cookie 值。同样地。

4

5 回答 5

4

我会通过在用户表中创建一个 activeKey 列来解决类似的问题。每次用户登录时,activeKey 都会更改(简单的方法 subchar(md5(time().$username), 0, 16)),并将其存储在会话中。每次刷新/输入网页时都会检查密钥。如果不匹配,则使用信息注销。在正确的注销键将被设置为 NULL,所以当它可以给出一个标志。

这个方法可以和IP地址结合,但是只能欺骗IP地址,和MAC一样,以此类推。

这是一个主要思想。可能还有其他数据,例如上次登录日期、IP 上次登录日期等。

于 2012-04-19T09:38:05.110 回答
3

您可以有一个包含当前登录用户的 ID 和 IP 地址的表。每次有人登录时检查此表即可。

于 2012-04-19T09:10:42.247 回答
2

这是一个不需要持续数据库访问即可工作的解决方案...

(这将避免每次请求/刷新页面时根据数据库值检查 session_id() 的要求,从而减轻数据库/服务器压力)...

1.登录时,为该用户获取存储在数据库中的预先存在的 session_id 并执行以下操作:

session_id("the pre-existing session id in the database goes here");
session_start();
session_destroy();

2.然后开始一个新的会话,并将这个新的 session_id 保存到数据库中,覆盖之前的。如果有一个活动的,这将注销该用户的上一个会话(有效地注销使用此帐户的其他人)。

试一试,让我知道这是否有效!

注意:这是“理论上的”,因为我还没有尝试过。它基于这个公认的 stackoverflow 答案。而且您可能应该根据每个用户独有的内容手动创建 session_id,这样您就不会清除其他人正在使用的会话,而该会话恰好与您正在检查的用户上次使用的会话相同为了。

于 2013-05-21T22:13:00.963 回答
1

我认为,每个用户只需要额外的 2 列——用户表中的“LastLoginTime”和“IPAddress”。如果持续时间太短并且 IPAddress 变化,那么您可以向用户发出警告。此外,您还可以告知用户登录的城市和国家。

于 2012-04-19T09:16:10.180 回答
0

我会在 users 表中添加一个 ipAddress 列、一个 LastLogin 日期列、带有布尔值的 LogStatus 列(实际上 MySQL 使用 1/0 作为布尔值)来检查用户是否登录,一个 Country 列(尽管这可能是通过使用代理绕过),以及一个blockedStatus列,再次使用1/0值,将检查用户是否被阻止。

然后在登录页面,您将检查用户是否已登录然后他无法登录,如果他最近登录,并且国家/地区不同,那么发生了一些事情,您需要阻止该帐户并发送如果合法用户是登录的用户,则一封带有解锁帐户链接的电子邮件。

于 2012-04-19T09:27:45.363 回答