Codeigniter - 会话到期和“记住我”功能

时间:2013-01-27 17:45:28

标签: php codeigniter

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

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

  • 我将config中的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 +数据库令牌的任何输入都会很棒。

3 个答案:

答案 0 :(得分:9)

我为此问题找到的最简单的解决方案是通过这种方式修改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
        }

答案 1 :(得分:4)

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

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

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

第三:编辑系统会话库[我不确定扩展会话是否有效] 转到sess_read()方法

中的这一行
if (($session['last_activity'] + $this->sess_expiration) < $this->now)

在该行之前添加以下代码

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

这对我来说很好。

答案 2 :(得分:1)

我不能说这不对,但我可以告诉你我这样做的方式:

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

然后:

  1. 登录设置会话userdata

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

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

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

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