codeigniter 中的会话令牌更改

Posted

技术标签:

【中文标题】codeigniter 中的会话令牌更改【英文标题】:session token changes in codeigniter 【发布时间】:2019-04-16 05:26:27 【问题描述】:

我有一个 Web 应用程序,在其中我提供了注销的选项。注销时会话被破坏,即。由 system>libraries>Session.php 中的 sess_destroy() 删除。

但是每当用户注销时,与用户对应的令牌被删除,而是在会话表中创建新令牌,没有任何用户数据。

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

注销 -> 登录页面中的 __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 被删除。但是一旦加载了新页面并加载了会话库,它就会在会话表中插入新行。

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

附言我正在使用 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();
    

【问题讨论】:

请告诉我们你是如何破坏你的会话 @Lithilion 请检查更新的代码。谢谢 我假设您销毁会话和数据并重定向到“注销”页面或索引。会不会是你在那里开始一个新的会话? 是的,当用户注销时,我将用户重定向到登录页面。当控制流转到 autoload.php 时,会加载会话库,并且在会话的构造中,另一个会话会在没有任何数据的情况下启动。 【参考方案1】:

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

以上所有内容,如果您想阻止您遇到的行为,而不是破坏会话,只需取消设置其变量,使其变为空即可。

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

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

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

【讨论】:

以上是关于codeigniter 中的会话令牌更改的主要内容,如果未能解决你的问题,请参考以下文章

更改密码后 Parse 中的会话令牌无效

Chrome 和 Internet Explorer 中的 Codeigniter 销毁会话

提交表单时,会话变量会更改值。

CodeIgniter 会话 ID 更改且无法正常工作

Codeigniter CSRF - 它是如何工作的

Codeigniter 中的会话变量不工作