Сессия теряется при восстановлении идентификатора сессии в codeigniter - PullRequest
1 голос
/ 22 марта 2019

У меня есть приложение 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");
    }
}

Теперь я должен исправить проблему Session Fixation путем регенерации идентификатора сессии перед аутентификацией пользователя. Когда я включаю session_regenerate_id() или даже функцию $this->session->sess_regenerate(), специфичную для кодового указателя, она работает внутри этой функции, но как только она перенаправляется на /user/dashboard, данные сеанса становятся пустыми.

Я добавляю линию регенерата как раз перед $this->session->set_userdata($session_data);. Приведенный выше код прекрасно работает без регенерата.

Кроме того, я использую драйвер сеанса database . Когда я переключаюсь на драйвер файлов, даже логика регенерации работает отлично. Это просто что-то с драйвером базы данных (я чувствую) вызывает эту проблему.

1 Ответ

0 голосов
/ 06 апреля 2019

Я исправил это после нескольких дней проб и ошибок.

Это присутствовало в Codeigniter 3.0.x, также на PHP 7.x (на котором работало мое приложение)

После продолжительного поиска я наткнулся на журнал изменений Codeigniter, в котором упоминалось исправление ошибки регрессии в некоторых более поздних версиях (3.0.x) Codeigniter, и именно тогда я начал сканировать изменения в библиотеке сеансов 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;

Как раз когда я внес это единственное изменение в мою существующую систему кодирования, проблема была решена мгновенно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...