1

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

场景如下:

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

由于他设置了保持登录状态,他得到了他的会话,他可以发布一个故事并在他的帐户中做任何事情,而不知道他的帐户在前一天已被删除。另外,我设置了 14 天的记忆。

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

谢谢

4

6 回答 6

3

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

请参阅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;
    }
于 2012-03-12T20:51:12.597 回答
2

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

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

于 2012-03-12T11:16:13.330 回答
1

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

于 2012-03-12T11:18:25.007 回答
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;
}
于 2012-03-12T11:17:49.030 回答
0

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

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

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

于 2012-03-12T11:20:26.213 回答
0

您只能检查您检查的内容。当会话结束并且用户被删除并且持久登录过程启动以保持用户登录时,它需要验证用户仍然存在。– 哈克雷

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

于 2012-03-12T11:22:09.650 回答