【问题标题】:session token changes in codeignitercodeigniter 中的会话令牌更改
【发布时间】:2023-03-03 05:18:19
【问题描述】:

我有一个 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 时,会加载会话库,并且在会话的构造中,另一个会话会在没有任何数据的情况下启动。

标签: php codeigniter session


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多