会话令牌在codeigniter中的更改

时间:2018-11-13 11:25:09

标签: php codeigniter session

我有一个Web应用程序,在其中可以注销。注销后,该会话即被破坏。由sess_destroy()在system> libraries> Session.php中删除。

但是,只要用户注销,就删除与该用户相对应的令牌,而是在会话表中创建没有任何用户数据的新令牌。

以下是当我再次将用户重定向到登录页面时所经历的流程,流程如此,

注销->登录页面中的__construct()-> CI_Controller中的__construct()-> Loader.php中的initialize()-> Loader.php中的_ci_autoloader()-> autoload.php中的$ autoload ['libraries'] -> Session.php中的__construct()->

if ( ! $this->sess_read()) {
        $this->sess_create();
      } else {
        $this->sess_update();
      } 

然后在sess_read()中

        $session = $this->CI->input->cookie($this->sess_cookie_name);
        // No cookie?  Goodbye cruel world!...
        if ($session === FALSE)
        {
            log_message('debug', 'A session cookie was not found.');
            return FALSE;
        }

在sess_create()中加入另一个,并创建另一个会话,

$this->userdata = array(
                            'session_id'    => md5(uniqid($sessid, TRUE)),
                            'ip_address'    => $this->CI->input->ip_address(),
                            'user_agent'    => substr($this->CI->input->user_agent(), 0, 120),
                            'last_activity' => $this->now,
                            'user_data'     => ''
                            );

在创建会话时,会将其分配给cookie,在销毁会话时删除cookie。但是一旦加载了新页面并同时加载了会话库,它将在会话表中插入新行。

这增加了数据库的大小,我希望社区对此事提出建议。还有其他人面临同样的问题吗?

p.s。我正在使用CI2

会话请求,

function sess_destroy()
    {
        // Kill the session DB row
        if ($this->sess_use_database === TRUE && isset($this->userdata['session_id']))
        {
            $this->CI->db->where('session_id', $this->userdata['session_id']);
            $this->CI->db->delete($this->sess_table_name);
        }

        // Kill the cookie
        setcookie(
                    $this->sess_cookie_name,
                    addslashes(serialize(array())),
                    ($this->now - 31500000),
                    $this->cookie_path,
                    $this->cookie_domain,
                    0
                );

        // Kill session data
        $this->userdata = array();
    }

1 个答案:

答案 0 :(得分:0)

这在CI中并不意外,因为只要访问者访问使用会话库的任何内容,都会创建/更新会话。 这些会话为“空”(因为用户未登录)的事实有点无关紧要。您可以定期清空会话表(通过删除所有不包含数据的会话),但是可以节省的空间并不多。

以上所述,如果您想防止自己遇到的问题,而不是破坏会话,只需取消设置其变量,使其变为空即可。

unset ($this->session->userdata);

这样,用户将保持相同的会话cookie,唯一的变化是它将丢失数据库中包含的数据,从而有效地注销用户。

编辑:我对CI 2并不是特别熟悉,因为我的所有代码现在都放在CI3上,而我曾经在CI2上拥有的任何东西早已不复存在。但是看起来您在会话管理上遇到了不必要的麻烦,而不是完全依赖CI的内置功能,这可能有些次优