簡體   English   中英

會話因在Codeigniter中重新生成會話ID而迷路

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM