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 中的会话令牌更改的主要内容,如果未能解决你的问题,请参考以下文章