Почему PHP не читает идентификатор сеанса, отправленный через cookie? - PullRequest
0 голосов
/ 02 мая 2018

Я обновляю приложение с CodeIgniter 2.2.1 до 3.1.8. Приложение аутентифицирует пользователей и сохраняет состояние аутентификации в сеансе, и после обновления, которое прервалось, и пользователи больше не могут войти в систему. Я использую PHP версии 7.1.12 через PHP-FPM на nginx на виртуальной машине Linux.

Я потратил лучшую часть 1,5 дней, пытаясь разобраться в этом. Насколько я могу судить, все сводится к тому, что PHP не читает идентификатор сеанса, отправляемый браузером через cookie, и создает новый сеанс (и идентификатор сеанса) для каждого запроса. Я могу сказать это по тому факту, что значение ci_session в файле cookie запроса отличается от значения ci_session в соответствующем файле cookie ответа (как отображается в Firefox devtools), а также от того, что каждый файл создается каждый раз время. (Я настроил CodeIgniter для использования драйвера файлов.)

При попытке отладки, если я записываю значение session_id() перед вызовом session_start()/system/libraries/Session/Session.php, строка 143 ), я просто вижу пустую строку. Сразу после этого я вижу тот же новый идентификатор сеанса, который Firefox показывает в файле cookie ответа.

Я довольно подробно прочитал:

и попробовал следующие средства, но безрезультатно:

  • установите PHP error_reporting на E_ALL и проверьте журнал ошибок PHP на наличие сообщений, например. в отношении уже выведенных заголовков
  • изменил значение $config['encryption_key'] на случайную 32-символьную строку, скопированную из раздела CodeIgniter http://randomkeygen.com/
  • изменил значение $config['sess_cookie_name'] на строку, состоящую только из строчных буквенно-цифровых символов
  • удостоверился, что файлы сеанса действительно создаются в каталоге $config['sess_save_path'], с правильными идентификаторами и информацией
  • попытался установить $config['cookie_domain'] на .domainname.tld (а также просто '')
  • прыгнул прямо к CI 3.1.8 (я изначально обновился до 3.0.0 и планировал выполнять инструкции по обновлению для каждого выпуска до 3.1.8. Я этого еще не сделал, вместо этого я просто заменил /system папка с версией 3.1.8).

Ниже я вставил все соответствующие настройки из CI и из PHP. Очевидно, я что-то упускаю, вполне возможно, что-то действительно простое. Как я могу диагностировать дальше / исправить?

Настройки CodeIgniter

$config['cookie_prefix']    = "";
$config['cookie_domain']    = "";
$config['cookie_path']      = "/";
$config['cookie_secure']    = FALSE;


$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 3600 * 24 * 60; // 60 days
$config['sess_use_database']    = FALSE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_time_to_update']  = 300;
$config['sess_driver'] = 'files';
$config['sess_save_path'] = BASE . 'storage/session';

Настройки PHP

Session Support     enabled
Registered save handlers    files user
Registered serializer handlers  php_serialize php php_binary wddx
Directive   Local Value Master Value
session.auto_start  Off Off
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly Off Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off
session.gc_divisor  1000    1000
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.lazy_write  On  On
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   /var/opt/remi/php71/lib/php/session /var/opt/remi/php71/lib/php/session
session.serialize_handler   php php
session.sid_bits_per_character  5   5
session.sid_length  26  26
session.upload_progress.cleanup On  On
session.upload_progress.enabled On  On
session.upload_progress.freq    1%  1%
session.upload_progress.min_freq    1   1
session.upload_progress.name    PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix  upload_progress_    upload_progress_
session.use_cookies On  On
session.use_only_cookies    On  On
session.use_strict_mode Off Off
session.use_trans_sid   0   0

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

ОК, я исправил это в конце концов. Я не уверен, каким было решение, но последнее изменение, которое я внес, которое исправило его, заключалось в удалении из моего браузера всех файлов cookie, относящихся к сайту, заметив, что в суперглобальном файле $_COOKIE нет записи для ci_session ( имя файла cookie, настроенного в $config['sess_cookie_name']), несмотря на то, что оно отображается в запросе браузера, отображаемом в Firefox devtools.

По пути я тоже:

  • Обновлен с PHP 7.1 до PHP 7.2
  • Удалены два устаревших параметра сеанса CI 2.2 (в частности, $config['sess_use_database'] и $config['sess_table_name'])
  • Добавлен новый параметр, присутствующий в CI 3.1.8, и, возможно, более ранние версии ($config['sess_regenerate_destroy'] = FALSE;)

Кстати, я также заметил, что session_id() ничего не возвращает до вызова session_start(), даже когда сессии работают должным образом (и правильное значение ci_session присутствует в $_COOKIE). Поэтому я ошибся, интерпретируя пустую строку, возвращаемую session_id(), как признак того, что PHP не может прочитать значение, переданное ему как часть файла cookie.

0 голосов
/ 03 мая 2018

Проблема, которую вы описываете, обычно является неправильной настройкой элемента $config.

Вам нужно перейти к документу Обновление с 2.2.x до 3.0.x и пройти его шаг за шагом. Шаг 6 говорит о том, что нужно сделать, чтобы обновить использование сеанса. Похоже, вы используете v2.x сессию $config предметов. В $config есть важные изменения, связанные с сессиями. Посмотри в первую очередь. Одним из основных является то, что $config['base_url'] установлен правильно. У плохой ценности есть все виды плохих побочных эффектов.

Возможно, вы захотите взглянуть на каждый из документов «Обновление» между 3.0.0 и текущей версией, чтобы увидеть, есть ли что-то, что может повлиять на ваш сайт. Существует не так много «шагов», кроме замены системной папки для большинства версий. Помимо v3.0.0, я не могу вспомнить, чтобы это влияло на сеансы. Но, тем не менее, есть несколько важных моментов, которые стоит уделить внимание.

Чтобы определить, работают ли сессии правильно, ознакомьтесь с этим простым репозиторием на GitHub .

Иногда эта проблема при использовании драйвера 'files' может быть проблемой с разрешениями. Но, как вы видите, файлы создаются, но это не так.

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