Zend框架记住我 - 工作问题

时间:2012-03-12 11:12:40

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

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

方案如下:

  1. 设置后用户登录,请保持登录状态。
  2. 他没有退出就关闭了系统。
  3. 他的帐号在当天晚上被删除。
  4. 他第二天早上上了这个网站。
  5. 由于他已经设定了逗留,他会得到他的会话,他可以发布一个故事并在他的帐户中做任何事情而不知道他的帐户在前一天被删除的事实。此外,我已经记住了14天。

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

    由于

6 个答案:

答案 0 :(得分:3)

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

请参阅persisted login with Zend_Session::rememberMe

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

我已经创建了一个revalidate函数,我在每个页面加载时调用它。在用户可以执行任何操作之前,从控制器的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;
    }

答案 1 :(得分:2)

  

由于他已经设定了逗留,他会得到他的会话,他可以发布一个故事并在他的帐户中做任何事情而不知道他的帐户在前一天被删除的事实。

删除用户时,您还必须删除所有用户的会话。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

ini_set()用于会话有效期

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

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

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

答案 4 :(得分:0)

当用户离开他的电脑并第二天回到你的网站时,他的会话已经过期了。此时,如果您允许他访问您的网站,那是因为他选择了记住,您可以通过在计算机上设置Cookie来实现。

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

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

答案 5 :(得分:0)

  

您只能查看您检查的内容。会议结束的那一刻   用户被删除,持久登录程序开始执行   保持用户登录,需要验证用户是否仍然存在。    - hakre

正如hakre所说,我认为你必须在每次尝试更改设置或执行诸如发送新帖子或发布新评论之类的内容时验证用户,让我们尝试一下