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

Jor*_*ath 10 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);
Run Code Online (Sandbox Code Playgroud)

我的配置文件:

$config['sess_expiration']      = 0;
$config['sess_expire_on_close'] = FALSE;
Run Code Online (Sandbox Code Playgroud)

我没有看到人们在项目中使用这个解决方案,我已经测试了它,但它似乎工作得很好.

那么,对于我的问题,你会说这是一个安全的做法吗?我应该知道的任何安全危险?此解决方案与cookie +数据库令牌的任何输入都会很棒.

小智 11

我找到的最简单的解决方案是通过这种方式修改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
        }
Run Code Online (Sandbox Code Playgroud)

  • 非常有用,谢谢.一年虽然是31557600秒:) (2认同)

Sad*_*dat 5

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

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

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

第三:编辑系统Session库【我不确定扩展Session是否有效】在sess_read()方法中转到这一行

if (($session['last_activity'] + $this->sess_expiration) < $this->now)
Run Code Online (Sandbox Code Playgroud)

在该行之前添加以下代码

if(isset($session['new_expiration'])){
   $this->sess_expiration = $session['new_expiration'];
}
Run Code Online (Sandbox Code Playgroud)

这对我来说很好用。


its*_*sme 2

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

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

然后:

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

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

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

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

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