【问题标题】:Why does a users $_SESSION variables appear on a different users page?为什么用户 $_SESSION 变量出现在不同的用户页面上?
【发布时间】:2016-03-03 03:17:15
【问题描述】:

我有一个简单的 PHP 和 MySQL 站点,它从数据库验证用户,然后为会员编号、名字和姓氏设置 $_SESSION 变量。

今天,在线网络研讨会结束后,多个成员同时登录以记录活动,当导航到不同页面时,其他成员的名字出现了(名字使用 php echo 显示为 $_SESSION[fname] 和 [lname ])。我以前从未见过这种情况,我最近更新了我的代码以使用 PDO 语句等,但仅用于数据库查询,我没有改变 $_SESSIONs 的启动或处理方式,所以我认为这与它。

我已经尝试通过使用测试帐户从两个不同的浏览器登录来对此进行测试,但只是弄乱了几次,然后它又可以正常工作了。

怎么会这样?有人可以建议一种方法来防止这种情况发生吗?任何帮助将不胜感激。

我的会话代码如下:

<?php session_start(); ?>
<?php if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 600)) {
// last request was more than 10 minutes ago
session_unset();     // unset $_SESSION variable for the run-time 
session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp ?>

【问题讨论】:

    标签: php mysql session


    【解决方案1】:

    来自声明:

    当导航到不同的页面时,其他成员的名字会出现

    ..这听起来像是一个不同的问题。当框架/服务器使用缓存时,可能会发生这种情况,无论是服务器本地的还是基于服务的(varnish、elasticache 等)

    您是否在服务器上/正在使用的代码或框架中使用任何缓存机制?如果是这样,请在短期内将其关闭,并进行更多测试。如果这不起作用,请更新您的问题,提供有关您的问题的更多信息 - 症状、要证明的测试、采取的措施等。

    干杯!

    【讨论】:

    • 我知道没有缓存。这个问题是由全国各地不同的人在登录时报告的,当他们转到不同的页面时,它会加载不同的成员信息。几乎就像 $_SESSION 不是用户自己的会话所独有的。我对会议不太了解。添加session_id()session_regenerate_id() 之类的内容会对此有所帮助吗?
    • 好吧,您可以通过回显session_id() 来调试问题,以表明每个用户的问题是/不是不同的。如果它不同,那么这可能指向一个单独的数据库查询获取用户信息的问题;如果它们相同,则可能是会话问题。在此要非常小心 - 如果您的 Web 应用程序将成员数据暴露给其他成员,您需要非常快速地进行修补。
    • session_id() 在我使用两个不同的浏览器使用两个不同的登录名登录时是相同的。我以一个用户身份登录,然后在不同的浏览器中以不同的用户身份登录。当我导航到另一个页面时,第二个用户数据显示在我的第一个登录浏览器中。我肯定需要解决这个问题,但我不知道为什么会这样。
    • 如果我将 iPad 用作第三台计算机,则问题不会重现。它似乎尊重单独的会话。然而,在我的 MacBook 上,使用两种不同的浏览器,我总是可以让它搞砸。 IP可能与它有关吗?如果是这样,它如何解释来自该国不同地区的人们同时遇到这个问题?我需要一个更强大的解决方案,我需要开始学习更多!
    【解决方案2】:

    我在session_start() 之后添加了session_regenerate_id(TRUE);,它似乎已经解决了这个问题。我的理解是,这将重新生成 session_id 并删除旧的。这仍然使我的$_SESSION 变量在页面之间保持活动状态,这正是我所需要的(尽管我不太了解该功能以理解原因)。

    如果这个问题有更好的解决方案,或者我正在创建其他我还不知道的问题,请发表评论。现在我的问题已经停止了。

    <?php session_start();
    session_regenerate_id(TRUE);
    ?>
    <?php if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 600)) {
    // last request was more than 10 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
    }
    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-22
      • 2015-11-08
      • 1970-01-01
      • 2023-04-07
      • 2019-01-27
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      相关资源
      最近更新 更多