我已经设置了一个登录系统,用于检查mysql db验证用户名,哈希密码和禁止列(0表示未禁用,默认值为1,表示禁止)。如果有禁止他们显然无法登录。
问题是我是php新手并且有一段时间试图找出如何注销当前登录的用户。现在我的cookie将持续2周,即使我禁止用户,他们的会话将保持活跃,因此他们将进行2周或更少的访问。
如何强制用户重新进行身份验证,而不会对群众造成不利影响。
答案 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查询)。如果是真的,你会破坏他的会话,所以他被迫重新认证。当然因为被禁止而失败了。