我正在Codeigniter中构建一个“记住我”功能,通常我会看到库/项目使用令牌在用户上设置cookie,此令牌会保存在数据库中,并在每次用户访问网站时进行比较。
在Codeigniter中我们可以设置会话到期时间,这导致我尝试不同的方法,这就是我做的:
所以我的登录代码如下:
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 +数据库令牌的任何输入都会很棒。
答案 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。
然后:
登录设置会话userdata
“记住我”设置一个单独的cookie(我存储一个加密的哈希,包含用户的电子邮件+密码+ id,即:md5(传递+电子邮件+身份证))
每次用户加载页面时,我都会控制是否存在记住我的cookie,如果存在,我会创建用户会话。
我唯一知道的是会话,使用加密密钥,恶意攻击者需要时间来解密,因此会话密钥越少,攻击者解密当前密钥的时间就越短。
我总是避免会话过期,所以记住我,总是对我认为不安全的东西,但无论如何是用户选择或不使用该功能;)