如果禁止用户,则终止活动会话

时间:2010-09-07 21:04:36

标签: php authentication session login

我已经设置了一个登录系统,用于检查mysql db验证用户名,哈希密码和禁止列(0表示未禁用,默认值为1,表示禁止)。如果有禁止他们显然无法登录。

问题是我是php新手并且有一段时间试图找出如何注销当前登录的用户。现在我的cookie将持续2周,即使我禁止用户,他们的会话将保持活跃,因此他们将进行2周或更少的访问。

如何强制用户重新进行身份验证,而不会对群众造成不利影响。

6 个答案:

答案 0 :(得分:3)

您的服务器知道与每个用户关联的cookie。为什么不从其“当前会话”表中删除该cookie?

如果cookie只是“用户名,谁登录”,那么你就会遇到一个真正的问题,因为cookie不是一个幻数,而是包含真实的信息,伪造就变得微不足道了。然后恶意用户可以简单地创建一个cookie,说“我是[管理员],我登录”,这显然是一个更大的问题。因此,如果你不能从“已知的cookie”表中删除会话cookie来解决这个问题,那么你需要担心一个更大的问题。

答案 1 :(得分:2)

如果您完全依靠自己的身份验证系统(对此有所了解,BTW),您只需要取消设置包含其身份验证状态的会话值。所以,如果您使用:

<?php
session_start();
if(isset($_SESSION['isloggedin']) && isBannedUser())
{
    session_unset(); 
    session_destroy();
} 
?>

上面的伪代码调用一个名为isBannedUser()的虚构函数来确定它们是否被禁止。如果是,请在上面的示例中调用session_unset()取消设置$_SESSION中存储的所有值,然后session_destroy()以完全关闭会话。有些人可能会争辩说,如果你正在销毁,你可能不需要取消设置,但我已经养成了清理我在代码中制作的所有变量和值的习惯。

这应该在每个页面中,以便您检查是否尽可能频繁地禁止它们。随着$_SESSION被破坏,用户被有效地踢出了需要身份验证的网站的任何部分。您需要在登录工作流程中实施支持代码,以防止被禁止的用户重新登录。

希望这有帮助。

答案 2 :(得分:1)

如果要将会话数据存储在数据库中,请删除包含其会话信息的行。或者,如果使用文件,则删除该文件。然后下一页加载,登录系统不应该能够验证他们的登录信息(因为该会话没有信息),并提示他们重新登录。

答案 3 :(得分:1)

在基于文件的会话系统上,维护一个计数器,触发定期检查数据库的更新,如:

<?php
    session_start();
    $_SESSION['hits_since_last_verification']++;

    if ($_SESSION['hits_since_last_verification'] > 100) {
       $banished = ... // get banishment flag from database
       if ($banished) {
           $_SESSION['loggedIn'] = FALSE;
       }
    }
?>

然后决定您希望禁止用户在网站周围继续进行访问的时间长度,直到会话数据刷新并启动它们为止。

另一个选项是外部脚本,它运行在会话存储目录中,依次加载每个脚本,检查用户是否被禁止,并根据需要更新会话文件。但是,即使是一个中等繁忙的系统,当你每X分钟打开/反序列化/检查放逐/更新/重新编译可能数千个会话文件时,这将是痛苦的。

答案 4 :(得分:0)

您可能希望将会话存储在另一个表中,并在禁止用户时将其删除。

你知道吗?每次用户加载会话时以及用户是否在那里时检查表。删除cookie并销毁会话(将他发送到您网站的索引)

答案 5 :(得分:0)

您可以将userID存储在会话中,并在每个请求中检查是否被禁止(SQL查询)。如果是真的,你会破坏他的会话,所以他被迫重新认证。当然因为被禁止而失败了。