【问题标题】:Zend framework Remember Me - working issueZend 框架记住我 - 工作问题
【发布时间】:2012-03-28 18:56:12
【问题描述】:

我使用以下软件包在我的网站中使用了记住我功能:http://www.jasperrooswinkel.com/unexpected-expiration-of-zend_auth-sessions/。它工作正常。但是我面临一个问题,被删除的用户可以仅仅因为保持登录状态而访问帐户。

场景如下:

  1. 用户登录后设置让我保持登录状态。
  2. 他在未退出的情况下关闭系统。
  3. 他的帐户在当天晚上被删除。
  4. 他第二天早上去现场。

由于他设置了保持登录状态,因此他获得了会话,并且可以在他的帐户中发布故事并执行任何操作,而无需知道他的帐户在前一天已被删除。另外,我设置了 14 天的记忆。

任何想法如何解决这个问题?

谢谢

【问题讨论】:

  • 您只能检查您检查的内容。当会话结束并且用户被删除并且持久登录程序启动以保持用户登录时,它需要验证用户仍然存在。
  • 真的取决于用户如何进行身份验证。您可以尝试访问您的数据库并手动删除他的帐户。
  • shirley 网站应该检查何时编辑或发布了用户是否有权这样做?否则,如果它给您带来这么多麻烦,我建议删除保持登录选项。或者,您可以检查会话信息以查看该用户在第二天返回该站点时是否仍然存在。除此之外,我想不出一个好的方法来执行此操作。

标签: php zend-framework remember-me stay-logged-in


【解决方案1】:

由于他设置了保持登录状态,因此他获得了会话,并且可以发布故事并在他的帐户中做任何事情,而无需知道他的帐户在前一天已被删除。

当您删除用户时,您也必须删除该用户的所有会话。

【讨论】:

    【解决方案2】:

    这正是为什么您需要为每个应用程序/页面设置会话超时。

    使用ini_set(),到会话的生命周期

    ini_set("session.cookie_lifetime","1800"); //half an hour
    

    然后检查会话是否在每个安全页面上都处于活动状态,例如

    if (!empty(session_id())) {
        header("Location: index.php"); //GO to home page
        exit;
    }
    

    【讨论】:

    • 感谢大家的宝贵意见。
    【解决方案3】:

    在数据库的 SESSIONS 表中,使用 ON DELETE CASCADE 的 USERS 表的外键。或者您可以在获取会话时对用户表执行 JOIN。

    【讨论】:

      【解决方案4】:

      当用户离开他的电脑并在第二天回到你的网站时,他的 Session 早就过期了。此时,如果您允许他访问您的网站,那是因为他选择了被记住,您可以通过在计算机上设置 cookie 来做到这一点。

      当您根据 cookie 对用户进行身份验证时,您必须对照数据库检查 cookie 值。 不要仅仅检查 cookie 是否存在

      这将解决您的问题。此外,它还会堵住一个主要的安全漏洞,恶意人员可以简单地在他的计算机上手动创建 cookie 并使用它们来对您的网站进行身份验证。

      【讨论】:

        【解决方案5】:

        您只能检查您检查的内容。会议结束的那一刻, 用户被删除,持久登录过程开始 保持用户登录,它需要验证用户是否仍然存在。 – 哈克雷

        正如 hakre 所说,我认为您每次尝试更改设置或执行诸如发送新帖子或发布新评论等操作时都必须验证用户,让我们试试吧

        【讨论】:

          【解决方案6】:

          将会话的过期时间延长几个小时以上是一个坏主意,原因有很多,不仅仅是因为您保留了已删除用户的会话。还有一个与您在数据库/会话存储中保持活动会话(使用 session_id)这一事实相关的性能和安全问题。

          persisted login with Zend_Session::rememberMe

          在任何情况下,您都应该在每次页面加载时重新验证您的用户帐户,以确保他的用户仍然存在并处于活动状态:

          我创建了一个重新验证函数,在每次页面加载时都会调用它。在用户可以做任何事情之前,从控制器的 init() 函数调用该函数。

           public static function revalidate() {
                  $userData = self::getIdentity();
          
                  $modelUsers = new \Model_Users();
                  $user = $modelUsers->fetchWithEmail($userData['email']);
          
                  if ($user instanceof \Model_User) {
                      if ($user->getRoleType() == 'ACCOUNT') {
                          return $user;
                      }
                  }
                  return false;
              }
          

          【讨论】:

            猜你喜欢
            • 2023-03-04
            • 1970-01-01
            • 2012-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-13
            相关资源
            最近更新 更多