Как правильно восстановить идентификаторы сессии? - PullRequest
2 голосов
/ 06 мая 2011

Я создал библиотеку сессий, и у меня возникла очень случайная ошибка (я не знаю, как выполнить это модульное тестирование, поэтому я просто заполнил все сообщения журнала и дождался, пока это не произойдет снова), что приводит к пользователь вышел из системы из-за несоответствия идентификатора сеанса.

Поток приложения выглядит так:

  • Сделан запрос с действительным идентификатором сеанса
  • Данные о сеансе найдены для этого идентификатора сеанса в БД
  • «Последнее действие» оказывается старым, поэтому оно обновляется и обновляется в БД
  • Новый идентификатор сеанса отправляется в ответе (в виде файла cookie)

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

Я неправильно понял концепцию восстановления идентификатора сеанса? Я воссоздаю идентификаторы сеанса только по соображениям безопасности, поэтому кто-то, кто решил войти в систему в течение года, по-прежнему время от времени меняет свой идентификатор сеанса.

Ответы [ 2 ]

0 голосов
/ 06 мая 2011

Я полагаю, вы используете session_set_save_handler(), верно ..?Если это так, попробуйте сделать следующее:

session_regenerate_id($delete_old_session = true);
session_write_close();

Или даже:

session_regenerate_id($delete_old_session = false);
session_write_close();

Вызов session_write_close() должен эффективно сохранить данные нового сеанса.На это нужно обращать внимание только при вызове (обычно до изменения привилегий> перенаправления), поскольку он завершает сеанс.


Завершает текущий сеанс и сохраняет данные сеанса.

Данные сеанса обычно сохраняются после того, как ваш скрипт завершается без необходимости вызывать session_write_close (), но поскольку данные сеанса заблокированы для предотвращения одновременной записи, только один скрипт может работать с сеансом в любое время.

0 голосов
/ 06 мая 2011

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

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