Внезапно данные сеанса уничтожаются при перенаправлении страницы - PullRequest
0 голосов
/ 07 февраля 2019

Я должен работать в нескольких поддоменах.Внезапно я не могу получить доступ ко всем моим поддоменам.Потому что при перенаправлении страницы данные сеанса были потеряны.Эта проблема возникает во всех моих поддоменах, но я ничего не изменил со своего сервера.Кто-нибудь, пожалуйста, помогите мне, почему эта проблема внезапно возникла и как решить эту проблему Мой домен был размещен в cpanel.Но мой код отлично работает в localhost

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

ОБНОВЛЕНИЕ: Эта проблема исправлена ​​в CI v3.1.1.Пожалуйста, обновитесь до> = 3.1.1, чтобы полностью избавиться от этой проблемы.

@ prakasht - Я столкнулся с подобной проблемой и обнаружил ее, когда искал исправление.Для меня это произошло при попытке обновить CI v2.2.6 -> v3.0.3

Внезапно мои сеансы перестали работать.Я добавил несколько журналов для отладки сценария в драйвере файлового сеанса system/libraries/Session/drivers/Session_files_driver.php

Имея централизованные сеансы как в моем предыдущем, так и в текущем месте работы, я обнаружил, что каким-то образом сеанс был заново создан длякаждый запрос, основанный на добавленных мною журналах.

Как ленивый человек, я пытался перебрать свой путь через него, когда увидел ваш ответ выше .

Это было дотеперь ближе всего я видел, как кто-то решает эту проблему с помощью Ci, поскольку все остальные просто добавляют хаки.Я попытался отладить код в файле system/libraries/Session/Session.php самостоятельно и обнаружил, что санация preg_match() никогда не совпадает.

В регулярном выражении при попытке проверить значение cookie попыталось сопоставить с

if (isset($_COOKIE[$this->_config['cookie_name']])
            && (
                ! is_string($_COOKIE[$this->_config['cookie_name']])
                OR ! preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']])
            )
        )

Я попытался сопоставить значение моего cookie с регулярным выражением ^[0-9a-f]{40}$ и обнаружил, что это не удалось.Итак, следуя определению в файле application/config/config.php, я изменил регулярное выражение на ^[0-9a-z_-]{1,40}$, что в основном означает, что регулярное выражение может соответствовать любому значению cookie между длинами от 1 до 40, состоящим из символов в любом из них или сочетанием набора 0-9, a-z, _ , -.

Код с фиксированным регулярным выражением

if (isset($_COOKIE[$this->_config['cookie_name']])
            && (
                ! is_string($_COOKIE[$this->_config['cookie_name']])
                OR ! preg_match('/^[0-9a-z_-]{1,40}$/', $_COOKIE[$this->_config['cookie_name']])
            )
        )

Это исправило это для меня.Надеюсь, что это сделает то же самое для вас.

PS: Я также заменил все экземпляры

$this->session->all_userdata() на $this->session->userdata()

и

$this->session->set_userdata($key, $value) с $this->session->key = $value

в моей кодовой базе согласно CI 2.2.x -> 3.x документация обновления и документация библиотеки сеансов

ОБНОВЛЕНИЕ: эта проблема исправлена ​​в CI v3.1.1.Пожалуйста, обновитесь до> = 3.1.1, чтобы полностью избавиться от этой проблемы.

0 голосов
/ 08 февраля 2019

Я изменил небольшую модификацию файла session.php

до изменения кода:

// Sanitize the cookie, because apparently PHP doesn't do that for userspace handlers
        if (isset($_COOKIE[$this->_config['cookie_name']])
            && (
                ! is_string($_COOKIE[$this->_config['cookie_name']])
                OR ! preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']])
            )
        )
        {
            unset($_COOKIE[$this->_config['cookie_name']]);
        }

ПОСЛЕ:

я изменил 32 вместо 40

// Sanitize the cookie, because apparently PHP doesn't do that for userspace handlers
        if (isset($_COOKIE[$this->_config['cookie_name']])
            && (
                ! is_string($_COOKIE[$this->_config['cookie_name']])
                OR ! preg_match('/^[0-9a-f]{32}$/', $_COOKIE[$this->_config['cookie_name']])
            )
        )
        {
            unset($_COOKIE[$this->_config['cookie_name']]);
        }

В этом случае данные сеанса загружаются на основе идентификатора cookie.Но идентификатор cookie был макс. 32. Но предыдущий код определяет 40. когда идентификатор cookie был между 33 и 40. Данные сеанса были потеряны

Но я сомневаюсь, как предыдущий код работал хорошо с 2 днями ранее в прямом эфире?.В то же время предыдущий код все еще работает на моем локальном хосте?

...