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

Php 如果用户被禁止,则终止活动会话,php,authentication,session,login,Php,Authentication,Session,Login,我已经建立了一个登录系统来检查mysql db验证用户名、哈希密码和禁用列(0表示未禁用,是默认值,1表示禁用)。如果有禁令,他们显然不能登录 问题是我对php不熟悉,花了很多时间试图弄清楚如何注销当前登录的用户。目前,我的cookie将持续2周,即使我禁止了一个用户,他们的会话也将保持活跃,因此他们的访问权限将持续2周或更少 如何强制用户重新验证,而不惩罚用户。如果将会话数据存储在数据库中,请删除包含其会话信息的行。或者,如果使用文件,则删除该文件。然后在下一页加载时,登录系统将无法验证他们的

我已经建立了一个登录系统来检查mysql db验证用户名、哈希密码和禁用列(0表示未禁用,是默认值,1表示禁用)。如果有禁令,他们显然不能登录

问题是我对php不熟悉,花了很多时间试图弄清楚如何注销当前登录的用户。目前,我的cookie将持续2周,即使我禁止了一个用户,他们的会话也将保持活跃,因此他们的访问权限将持续2周或更少


如何强制用户重新验证,而不惩罚用户。

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

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


你知道。每次用户加载会话时,如果用户不在,请检查该表。删除cookie并销毁会话(将其发送到站点索引)

您可以在会话中存储用户ID,并在每次请求时检查他是否被禁止(SQL查询)。如果为真,您将破坏他的会话,因此他将被迫重新验证。当然失败了,因为他被禁止了。

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


如果cookie只是“username,who登录”,那么您就有了一个真正的问题,因为cookie中包含的不是一个神奇的数字,而是真实的信息,因此伪造它变得微不足道。然后,恶意用户只需创建一个cookie,上面写着“我是[admin],我已登录”,这显然是一个更大的问题。因此,如果您不能从“已知cookies”表中删除会话cookie来解决此问题,那么您需要担心一个更大的问题。

如果您完全独立完成身份验证系统(值得称赞,顺便说一句),您只需取消设置包含其身份验证状态的会话值即可。因此,如果您使用:

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

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

这应该出现在每个页面中,以便您尽可能频繁地检查它们是否被禁止。通过
$\u会话
的销毁,用户将被逐出需要验证的网站的任何部分。您需要在登录工作流中实现支持代码,以防止被禁止的用户重新登录


希望这是有帮助的

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

<?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分钟打开/取消序列化/检查禁用/更新/重新序列化数千个会话文件时,这也会很痛苦。

如果您的站点只允许cookie说“我在第xxx天之前都很好”不要检查数据库中的数据,我想你已经有麻烦了——客户端计算机上的所有数据都必须被认为是可损坏的/不可靠的——我想你应该在数据库中存储这样的信息。如果你已经设置了这样一个检查,只需将它添加到代码中。这正是我的网站正在做的…如果有人知道一个关于设置“已知cookies表”的好图坦卡门,我想我可以解决剩下的问题。相当愚蠢,我非常担心阻止用户登录,但我没有花一点时间意识到登录可以完全绕过。是的,我觉得我做错了什么。我甚至没有想过将会话信息存储在一个单独的表中……我想我还有更多的研究要做,因为如果通过mysql检查会话信息,原始问题似乎更容易回答。哎呀!很高兴有人指给你看。交互式网站设计的一个重要指导原则是“假设你会被欺骗”:客户端可以对服务器说任何它想说的话。它可以在任何时间发送包含任何内容的任何消息。但它不知道你没有告诉任何人的事情。你的服务器如何保护自己不被试图闯入你的系统的人欺骗?我真的很感谢你的帮助。只是为了确保我的方法正确。一旦我设置了“cookie表”,每个安全页面都应该查询mysql数据库,看看a)用户是否有效,而不是欺骗者,b)用户是否被禁止。这是一个合理的方法。不过,请注意文章中建议的策略的缺点:用户一次只能从一台计算机登录,否则,旋转cookie将失去同步并注销。你不需要每次点击“活动会话cookies”表时都重新查询“is Banked”列,但是-只要在用户被禁止时删除该cookie,他就会注销,因为找不到cookie,新的登录将失败。是的,我自己做。你的代码非常合理。现在我只是检查登录信息,而不是任何会话数据。从来没有想过要储存它