Почему при закрытии браузера сессия не заканчивается, когда session.cookie_lifetime = 0? - PullRequest
6 голосов
/ 15 декабря 2011

Я установил тестовую версию PHP-сайта, который использует сессии для обработки пользовательских входов.На тестовом сервере сеанс истекает при закрытии браузера, поскольку при копировании всего содержимого на «чистый» живой сервер сеанс остается на месте при закрытии браузера, и пользователь все еще входит в систему даже на следующий день после полной перезагрузки системы.

В php.ini

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime
session.cookie_lifetime = 0

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

Я подумал, что, возможно, он где-то был переопределен, но если я напечатаю _r session_get_cookie_params в PHPЯ получаю

Array
(
    [lifetime] => 0
    [path] => /
    [domain] => 
    [secure] => 
    [httponly] => 
)

Что-то мне не хватает?

Ответы [ 3 ]

8 голосов
/ 10 января 2013

Если вы используете Google Chrome

, если вы установили «продолжить с того места, где я остановился», Chrome восстановит ваши данные о просмотре и файлы cookie сеанса.

даже сеанс входа в Facebook (без «запомнить меня») сохраняется.

для получения дополнительной информации

настройка Google Chrome

4 голосов
/ 15 декабря 2011

Проблема здесь в том, что Firefox имеет функцию под названием «Восстановить последнюю сессию». Если кто-то использует вкладки сохранения при закрытии, то это то же самое. Когда браузер восстанавливает последнюю сессию, все сессионные куки тоже будут восстановлены :)

Так что ваш сессионный cookie может жить вечно. Вы можете узнать больше на сеансовых cookie-файлах Firefox

3 голосов
/ 15 декабря 2011

Я собирался добавить это в качестве комментария к отличному ответу Александра, но он получит немного многословно.

Как долго cookie сохраняется в браузере и как долго данные сеанса хранятсясервер при отсутствии запроса - это 2 отдельные и независимые вещи.Невозможно избежать этого из-за природы HTTP без состояния - хотя есть некоторые вещи, которые вы можете сделать, чтобы смягчить то, что вы воспринимаете как недостаток безопасности.

Для браузера, чтобы получить доступ к тому же сеансу после закрытиявыключен и требует некоторой задержки, чтобы браузер сохранял оба файла cookie сеанса (что Александр уже объяснил) и , чтобы сервер сохранил данные сеанса.

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

Вы не предоставили никакой информации о том, как настроены 2 сервера, в частности, session.gc_maxlifetime.

Если время сеанса session.gc_maxlifetime истекло между запросами, но данные сеанса по-прежнему доступны, это означает, что обработчик сеанса просто рассматривает это как время, когда сеанс считается пригодным для сбора мусора (что семантическидля чего нужен вариант конфигурации).Однако есть веские основания рассматривать это значение как TTL.Чтобы решить эту проблему, вы можете либо заставить сборщик мусора запускаться чаще и удалять данные сеанса, либо использовать обработчик сеанса, который игнорирует данные сеанса старше указанного предела.

что вы видите разницу между двумя системамиможет быть связано с различными значениями для session.gc_maxlifetime или с различиями в частоте сборки мусора или даже с разными обработчиками сеанса.

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