[英]Session getting lost on regenerating session id in codeigniter
我有一个codeigniter应用程序,在该应用程序中,当用户登录时会设置会话,并向用户显示面板,其内容类似于以下代码:
public function checkLogin()
{
$username = $this->input->post("username");
$password = $this->input->post("password");
$userId = $this->ModelLogin->checkLogin($username, $password);
if ($userId) {
$session_data = array(
'is_logged_in' => true,
'userId' => $userId,
);
$this->session->set_userdata($session_data);
redirect("/user/dashboard");
} else {
$this->session->set_flashdata('login_error', "Incorrect username/password");
}
}
现在,我将通过在验证用户身份之前重新生成会话ID来解决会话固定问题。 当我包含session_regenerate_id()
或什至特定于$this->session->sess_regenerate()
函数时,它在此函数中均有效,但是一旦将其重定向到/user/dashboard
则会话数据将变为空白。
我在$this->session->set_userdata($session_data);
之前添加重新生成行$this->session->set_userdata($session_data);
。 上面的代码无需重新生成即可完美运行。
此外,我正在使用数据库会话驱动程序。 当我切换到文件驱动程序时,即使重新生成逻辑也可以正常工作。 这只是数据库驱动程序引起的(我认为)是导致此问题的原因。
经过几天的反复试验,我修复了此问题。
这在Codeigniter 3.0.x中也存在于PHP 7.x中(这是我的应用程序所运行的)
经过广泛的搜索,我偶然发现了Codeigniter更改日志,其中提到了Codeigniter的某些更高版本(3.0.x)中的回归错误修复,并且这是我开始浏览Codeigniter会话库和数据库驱动程序中的更改的地方,在其中找到了此代码段:
// PHP7 will reuse the same SessionHandler object after
// ID regeneration, so we need to explicitly set this to
// FALSE instead of relying on the default ...
$this->_row_exists = FALSE;
当我将这唯一的行更改引入到现有的Codeigniter系统中时,问题立即得到解决!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.