当前位置: 首页 > 面试题库 >

如何防止在PHP网站中多次登录

衡子安
2023-03-14
问题内容

我想防止在php应用程序中多次登录。

首先,我在用户表中创建登录状态(活动,非活动)。

当用户A登录时,用户状态将设置为“活动”,如果用户注销,则状态将设置为“非活动”。当另一个客户端尝试使用相同的用户帐户登录时,我检查用户表。如果用户仍处于活动状态,则将错误登录发送给用户。

发生问题,如果用户关闭浏览器,则可以更新用户表中的状态,因为用户没有单击注销。

您对此有什么建议吗?


问题答案:

(请注意,尽管此处的技术仍然有些有效;但是不应逐字复制PHP示例,因为有更安全的方法将用户提供的值合并到SQL查询中)

与其存储用户是否处于活动状态\非活动状态,不如存储一些可以按用户针对用户进行检查的属性;例如,每次用户尝试执行需要身份验证的操作时,它都会检查该属性是否匹配,然后再进行操作。

我建议您执行以下操作;

首先,创建一个哈希值以在用户每次登录时唯一标识该用户。我想,一个sha1of
time()足以避免冲突。无论选择什么,请确保其变化足够大,以便另一个登录的用户接收到相同哈希的可能性极低(例如,请勿对IP地址或浏览器的用户代理进行哈希,因为这些不会变化)足够)。

第二,在登录时将此哈希存储在数据库中以及用户会话中。这样做将有效地“注销”先前的用户,因为每次有人登录时哈希都应不同。

由于我们使用的是会话,因此应将Cookie自动放置在用户的浏览器中,该cookie将包含一个唯一ID,该ID可以根据用户的会话数据识别该用户。cookie的内容并不是真正值得关注的。

接下来,创建一个称为authenticateUser()或类似函数,将在每个脚本的开头调用该函数以确保对用户进行身份验证。该脚本应查询数据库,以检查具有您用户ID的用户的哈希是否与您的哈希匹配。

例如:

function authenticateUser($id, $hash, $databaseLink) {
    # SQL
    $sql = 'SELECT EXISTS(
               SELECT 1
               FROM `tbl_users`
               WHERE `id` = \''.mysql_real_escape_string($id).'\'
               AND `hash` = \''.mysql_real_escape_string($hash).'\'
               LIMIT 1
           );';

    # Run Query
    if ($query = mysql_query($sql, $databaseLink)) {
        # Get the first row of the results
        # Assuming 'id' is your primary key, there
        # should only ever be one row anyway.       
        $result = mysql_fetch_row($query);

        # Casting to boolean isn't strictly necessary here
        # its included to indicate the mysql result should
        # only ever been 1 or 0.
        return (bool)($result[0]);
    } else {
        # Query error :(
        return false;
    }
}

然后,我们只需传递authenticateUser()用户的IDhash(根据您的会话数据)和database link(对于数据库连接,您必须先打开)。

如果authenticateUser()返回true,则对用户进行身份验证。如果为false,则用户不是,或者数据库不可用或存在SQL错误。

但是请注意,这将增加服务器负载,因为每个页面请求发送一次数据库请求。在大型项目上执行此操作可能不是那么明智,因为在任何时候都有成千上万的人正在登录。我确定有人可以提出改进建议。

另外,等待cookie过期并不是强迫不活动的人注销的最佳方法,因为您永远不要信任cookie。相反,您可以添加一个称为的列,您可以在last_active每次对用户进行身份验证时进行更新。这也将增加服务器负载,但是将允许您删除hash3小时不活动的用户的,从而手动覆盖陈旧的登录。



 类似资料:
  • 问题内容: 目前,我试图阻止脚本多次运行: 并且有一个cron作业每分钟执行一次以上脚本: 它可以工作一段时间。几天后,当我这样做时: 我发现有 两个 实例正在运行!不是三个或更多,不是一个。我杀死了其中一个实例。几天后,又有 两个 实例。 代码有什么问题?还有其他替代方法来限制onlytask.php的一个实例正在运行吗? PS我的文件夹没有清理。显示锁定文件是在第一天创建的: 问题答案: 现在

  • 本文向大家介绍在PHP中提交表单时如何防止多次插入?,包括了在PHP中提交表单时如何防止多次插入?的使用技巧和注意事项,需要的朋友参考一下 提交表单时,PHP会话可用于防止多次插入。PHP会话设置一个会话变量(例如$ _SESSION ['posttimer']),该变量设置POST上的当前时间戳。在PHP中处理表单之前,请检查$_SESSION ['posttimer']变量是否存在,并检查特定

  • 问题内容: 防止Linux程序/守护程序在给定时间多次执行的最佳方法是什么? 问题答案: 最常见的方法是创建PID文件:定义文件将要到达的位置(在/ var / run内部很常见)。成功启动后,您会将PID写入此文件。在决定是否启动时,请阅读文件并检查以确保所引用的进程不存在(或者如果存在,则它不是守护程序的实例:在Linux上,您可以查看)。关机时,您可以删除文件,但这不是绝对必要的。 有一些脚

  • 本文向大家介绍php防止网站被刷新的方法汇总,包括了php防止网站被刷新的方法汇总的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php防止网站被刷新的方法。分享给大家供大家参考。具体方法如下: 对于像采用WP建设的站来说,频繁的刷新会导致数据库吃紧。下面附上一段代码,防止频繁的刷新造成的死机情况。 方法一,代码如下: 方法二,代码如下: 方法三,代码如下: 注意:代码有了,不过要应用到W

  • 问题内容: 我有一个运行在云服务器中的php站点。每当我添加新文件css,js或图像时,浏览器就会加载存储在缓存中的相同的旧js,css和图像文件。 我的网站具有doctype和meta标签,如下所示 由于上述doctype和元代码,我加载了浏览器中缓存的相同文件,而不是新文件 问题答案: 尝试这个

  • 问题内容: 我的问题是,它不仅需要基本的cookie,而且还要求会话cookie和随机生成的ID。我认为这意味着我需要将Web浏览器模拟器与Cookie罐一起使用? 我曾尝试使用Snoopy,Goutte和其他一些Web浏览器模拟器,但到目前为止,我还无法找到有关如何接收Cookie的教程。我有点绝望了! 谁能给我一个如何在史努比或古特接受饼干的例子吗? 提前致谢! 问题答案: 然后,我们应该能够