11

我正在 Codeigniter 中构建“记住我”功能,通常我看到库/项目使用令牌在用户上设置 cookie,此令牌保存在数据库中,并在每次用户访问网站时进行比较。

在 Codeigniter 中,我们可以设置会话过期时间,这导致我尝试不同的方法,这就是我所做的:

  • 我将配置中的 session_expiration 设置为 0(无限会话)
  • 如果用户未选中“记住我”,我会在会话中设置 2 小时时间,并在窗口关闭时销毁会话。

所以我的登录代码如下所示:

if (!$this->input->post('remember_me')) {
                $this->session->sess_expiration = 7200;
                $this->session->sess_expire_on_close = TRUE;
            }

            $this->session->set_userdata($session_data);

还有我的配置文件:

$config['sess_expiration']      = 0;
$config['sess_expire_on_close'] = FALSE;

我没有看到人们在项目中使用这个解决方案,我已经对此进行了测试,但它似乎工作正常。

所以,对于我的问题,你会说这是一种安全的做法吗?我应该知道任何安全隐患吗?对此解决方案与 cookie+数据库令牌的任何输入都会很棒。

4

3 回答 3

12

我为这个问题找到的最简单的解决方案是通过这种方式修改 Codeigniter 创建的 cookie:

        $this->session->set_userdata('user', $user); // a cookie has been created
        if($this->input->post('remember_me'))
        {
            $this->load->helper('cookie');
            $cookie = $this->input->cookie('ci_session'); // we get the cookie
            $this->input->set_cookie('ci_session', $cookie, '35580000'); // and add one year to it's expiration
        }
于 2015-08-02T17:24:26.130 回答
5

这也可以通过编辑/扩展系统会话库来完成。

第一:在配置文件中设置常规会话过期时间。 第二:在用户登录功能中添加记住我检查-

    if($remember)
    {
        $data['new_expiration'] = 60*60*24*30;//30 days
        $this->session->sess_expiration = $data['new_expiration'];
    }
    $this->session->set_userdata($data);

第三:编辑系统Session库【我不确定是否扩展Session会起作用】在sess_read()方法中进入这一行

if (($session['last_activity'] + $this->sess_expiration) < $this->now)

在该行之前添加以下代码

if(isset($session['new_expiration'])){
   $this->sess_expiration = $session['new_expiration'];
}

这对我来说很好。

于 2013-12-18T06:54:45.193 回答
2

我不能说这是不对的,但我可以告诉你我的做法:

首先,我将会话设置为在浏览器关闭时到期,默认正常运行时间为 7200。

然后:

  1. 登录设置会话用户数据

  2. “记住我”设置了一个单独的cookie(我存储了一个包含用户电子邮件+密码+id的加密哈希,即:md5(pass+email+id))

每次用户加载页面时,我都会控制是否存在记住我的 cookie,如果存在,我会创建用户会话。

我唯一知道的是该会话使用加密密钥,恶意攻击者将需要时间来解密,因此会话密钥越少,攻击者解密当前密钥的时间就越少。

我总是避免会话不会过期,所以记住我,我认为总是对安全性不利,但无论如何用户是否选择是否使用该功能;)

于 2013-01-28T11:23:59.600 回答