Zend框架Remember Me-工作问题


Zend framework Remember Me - working issue

我使用以下软件包在我的网站中使用了记住我的功能:http://www.jasperrooswinkel.com/unexpected-expiration-of-zend_auth-sessions/.它运行良好。但我面临一个问题,一个被删除的用户可以访问帐户仅仅因为停留在登录

场景如下:

  1. 用户登录后设置保持我登录
  2. 他没有签字就关闭了系统
  3. 那天晚上他的帐号被删除了
  4. 他在第二天早上接管了现场

由于他已经设置了保持登录,他可以在不知道自己的账户在前一天被删除的情况下,在自己的账户中发布一个故事并做任何事情。此外,我已将记忆设定为14天。

有什么想法可以解决这个问题吗?

感谢

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

请参阅使用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;
    }

由于他已经设置了保持登录,他可以在不知道自己的账户在前一天被删除的情况下,在自己的账户中发布一个故事并做任何事情。

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

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

当用户第二天离开电脑回到您的网站时,他的会话早已过期。在这一点上,如果你允许他访问你的网站,那是因为他选择了被记住,你可以在电脑上设置cookie。

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

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

你只能检查你检查的东西。会议结束的那一刻用户被删除,持久登录过程开始保持用户登录,需要验证用户是否仍然存在。–hakre

正如hakre所说,我认为每次用户试图更改设置或做一些事情,比如发送新帖子或发布新评论等,你都必须验证他。让我们试试

这正是需要为每个应用程序/页面设置会话超时的原因。

使用ini_set(),对会话生存时间

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

然后检查会话是否在每个像这样的安全页面上都是活动的

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