Codeigniter会话cookie并记住我的选择

时间:2011-09-17 14:47:31

标签: php session codeigniter cookies

您好我正在编写一个auth登录功能,我需要添加典型的记住我复选框以使会话不会过期。

这是最好的做法吗?

我想在用户ID中添加一个cookie并存储,然后当用户第一次浏览该网站时,检查该cookie,如果存在,我从cookie中获取用户ID并创建会话,这是正确的这样做的方法?那安全呢?

2 个答案:

答案 0 :(得分:2)

我将如何做到这一点:

创建一个名为“remember_code”的列,并在勾选“记住我”时生成随机生成的哈希

使用remember_code和用户身份(登录用户名或电子邮件)设置Cookie。

当他们尝试重新登录时,请同时检查:来自数据库的remember_code以及用户名/电子邮件,如果它们是正确的,请自动登录。

这种做法通常是安全的,但要仔细检查,您可以检查IP或用户代理以确保该用户是正确的。

答案 1 :(得分:0)

我在CodeIgniter 3上实现了一些不同的解决方案。

我对待记住我的选项,比如只延长会话时间。 I. e。标准会议时间为2小时,延长7天。

要做到这一点:

1 - 在表单中添加“记住我”复选框和隐藏字段

echo form_hidden('remember_me', '0');
echo form_checkbox('remember_me', '1');

2 - 在配置(config.php

下面添加
$config['sess_expiration'] = 72000; // standard time, 2hrs
$config['sess_extended_expiration'] = 604800; // extended time, 7 days

3 - 在MY_Session.php目录中创建application/libraries/Session

4 - 将代码放在下面

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Session extends CI_Session {

    public function __construct(array $params = array())
    {
        parent::__construct($params);

        // No session time manipulation
        if (!isset($this->_config['sess_extended']))
        {
            return $this;
        }

        if ($this->_config['sess_extended'])
        {
            // Remember for next regenerate execs
            setcookie(
                'remember_me',
                '1',
                (empty($this->_config['cookie_lifetime']) ? 0 : time() + $this->_config['cookie_lifetime']),
                $this->_config['cookie_path'],
                $this->_config['cookie_domain'],
                $this->_config['cookie_secure'],
                TRUE
            );
        }
        else
        {
            // Forget remember me
            setcookie(
                'remember_me',
                NULL,
                -1,
                $this->_config['cookie_path'],
                $this->_config['cookie_domain'],
                $this->_config['cookie_secure'],
                TRUE
            );
        }
    }

    protected function _configure(&$params)
    {
        // Restore standard session time
        if (filter_input(INPUT_POST, 'remember_me') === '0')
        {
            $params['sess_extended'] = false;
            return parent::_configure($params);
        }
        // Extend session time
        elseif (filter_input(INPUT_POST, 'remember_me') === '1' || (isset($_COOKIE['remember_me']) && !empty($_COOKIE['remember_me'])))
        {
            if (!empty(config_item('sess_extended_expiration')))
            {
                $_config[0] = & get_config();
                $_config[0]['sess_expiration'] = config_item('sess_extended_expiration');
                $_config[0]['sess_time_to_update'] = 0;

                $params['sess_extended'] = true;
            }
        }

        return parent::_configure($params);
    }

}

没有安全隐患,这只是延长的会话时间。

还记得服务器必须允许很长的会话时间。您可以通过

检查当前超时
var_dump(ini_get('session.gc_maxlifetime'));