我想避免来自不同位置的同一用户的多个登录,或者我想向用户的邮件发出警告或其他内容,以表明还有另一个登录到他们的区域。
如何在同一/最近时间从不同位置识别用户的多个登录?我认为表中的一些标志和IP检查可能是一个解决方案,但还有其他吗?
更新: 我认为会话或cookie可以帮助(对于单个机器),例如首次登录时创建活动密钥并在首次登录时将其存储到该机器中,并且每次用户登录该机器时也检查这些cookie值..所以如果他使用代理,它可以帮助识别用户..不是吗?我不确定它会产生任何安全问题或什么?
答案 0 :(得分:3)
您可以拥有一个包含当前登录用户的ID和IP地址的表。只要每次有人登录,都要检查此表。
答案 1 :(得分:2)
我会通过在用户表中创建一个activeKey列来解决类似问题。每次用户登录时,activeKey都会被更改(简单方式subchar(md5(time()。$ username),0,16)),并将其存储在会话中。每次刷新/输入网页时,都会检查密钥。如果dos不匹配,则使用info注销。在正确的注销键上将设置为NULL,因此它可以给出一个标志。
此metod可以与IP地址结合使用,但只有IP地址可以被欺骗,与MAC相同,等等。
这是一个主要想法。可能还有其他数据,如上次登录日期,IP上次登录日期等。
答案 2 :(得分: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保存到数据库,覆盖前一个会话。如果有一个活动的话,这将注销该用户的上一个会话(使用此帐户有效地注销其他人)。
尝试一下,让我知道是否有诀窍!
注意:这是“理论上的”,因为我还没有尝试过。它基于accepted stackoverflow answer。您应该manually create the session_id基于每个用户的独特内容,这样您就不会消除其他人正在使用的会话,这个会话恰好与您正在执行的用户上次使用的会话相同检查。
答案 3 :(得分:1)
我认为,每个用户只需要额外的2列 - “用户”表中的“LastLoginTime”和“IPAddress”。如果持续时间太短且IPAddress不同,则可以向用户发出警告。此外,您还可以通知City&用户登录的国家/地区。
答案 4 :(得分:0)
我会在users表中添加一个ipAddress列,一个LastLogin日期列,带有布尔值的LogStatus列(实际上MySQL使用1/0表示布尔值)来检查用户是否登录,一个Country列(尽管这可以通过使用代理)和一个带有1/0值的blockedStatus列来绕过,这将检查用户是否被阻止。
然后在登录页面,您将检查用户是否已登录,然后他无法登录,如果他最近登录,并且国家/地区不同,则会发生一些事情,您需要阻止帐户并发送一封电子邮件,如果合法用户是登录用户,则可以取消阻止该帐户。