У меня проблемы с сайтом PHP, который я запускаю на работе, когда пользователи выходят из системы через несколько минут (точное время варьируется, но достаточно часто, чтобы создавать проблемы), независимо от того, активно ли они использовали сайт.
Трудность в том, что я не могу воспроизвести эту проблему, если я вхожу в систему как те же пользователи, использующие один и тот же просмотр • Я не выхожу из системы, что говорит о том, что это не случай полного взлома сайта. К сожалению, у меня нет доступа к пользовательским машинам для запуска какого-либо программного обеспечения для отслеживания трафика.
Я уже проверял:
- Просить пользователей попробовать разные браузеры. Это, похоже, не решает проблему и в любом случае не является долгосрочным решением, поскольку я не могу диктовать, какие браузеры будут использовать клиенты.
- Время сервера правильное и соответствует пользовательским машинам.
- Пользователь Apache работает от имени пользователя и имеет разрешение на запись в папку сеанса, и я могу видеть, как создаются файлы сеанса и время их модификации обновляется.
- Функции буферизации вывода не используются.
- Проблема возникает на разных страницах, которые, кажется, не имеют ничего общего (т.е. дело не в том, что все они используют AJAX, или обновляют базу данных, или по какой-то другой причине).
- Пользователи получают доступ к своей учетной записи только с одного компьютера, т. Е. Они не работают на своем ноутбуке, переключаются на рабочий стол и затем задаются вопросом, почему они вышли из системы на своем ноутбуке (мы не разрешаем одновременный вход для одного и того же пользователя).
Настройки сеанса в PHP являются настройками Debian по умолчанию и не были изменены ни в файле .htaccess, ни где-либо еще. Основными из них являются:
session.cookie_lifetime 0
session.gc_divisor 100
session.gc_maxlifetime 1440
session.gc_probability 0
session.save_handler files
session.save_path /var/lib/php5
session.use_cookies On
Debian удаляет сеансы с помощью задания cron вместо использования сборщика мусора PHP, поэтому для gc_probability установлено значение 0. Используемая нами версия PHP: PHP 5.2.6-1 + lenny13 с Suhosin -Патч 0.9.6.2 (cli) (последняя версия в Lenny, мы скоро перейдем на Squeeze, но я не думаю, что это причина проблемы).
Мы используем Zend_Session для управления сеансами, и экземпляр Zend_Session_Namespace создается один раз на каждой странице, таким образом автоматически вызывая session_start ().Сеансы очищаются путем вызова Zend_Session :: destroy () на странице выхода, поэтому единственные способы выхода пользователя из системы:
- Если они явно щелкают ссылку выхода (мы регистрируемся, когда это происходит, и это не кажется в том случае, если при просмотре выполняется предварительная загрузка страницы и, таким образом, выход пользователя из системы).
- Если они оставят сеанс неактивным более 24 минут, в этот момент Debian, вероятно, удалит их сеанс (есть задание cron, которое запускается каждые полчаса, удаляя все сеансы, которые не были изменены более 24 минут).
- Если они закроют браузер, их сессионный куки-файл со сроком действия 0 будет удален.
Проверки для проверки того, вошел ли пользователь в систему:
- У них есть действительный сеанс (проверяется, проверяя, можем ли мы получить доступ к $ zsession-> user_id).
- В таблице сеансов есть строка с совпадающими идентификаторами пользователя и сеанса, и последний раз она обновлялась менее часа назад. Мы удаляем эту строку при выходе из системы, чтобы даже если сеанс все еще существует на диске, никто не может получить доступ к этой учетной записи без входа в систему.
Может ли кто-нибудь предложить другие вещи, которые я могу попробовать?
Изменить: Некоторые дополнительные вещи, которые я пробовал на основе оставленных комментариев:
- Установка session.cookie_domain: Похоже, это имеет очень странное поведение в PHP. Если я не установлю эту переменную и оставлю по умолчанию '' (пустая строка), то запрос www.domain.com создаст файл cookie www.domain.com. Однако, если я установил cookie_domain на «www.domain.com», домен для файла cookie будет «.www.domain.com» (обратите внимание на начальную точку, что означает, что он действителен для всего, что находится ниже www.domain.com, например, subsite.www). .domain.com).
- Установка session.cookie_lifetime: PHP, похоже, не обновляет время истечения срока действия для каждого запроса, поэтому, если я установил cookie_lifetime равным 3600, срок действия cookie истечет через час после первого посещения пользователем сайта, даже если он войдет в систему и будет постоянно его использовать. .
Редактировать 2: Основываясь на других вопросах, о которых спрашивали:
- Сайт размещен в центре обработки данных, в отдельной VLAN. Никто, обращающийся к сайту, не находится в той же сети, что и сайт.
- Не используется IP-аутентификация, и IP-адрес клиента не используется в какой-либо части процесса сеанса (например, мы не прикрепляем сеанс к IP-адресу и блокируем пользователя, если его следующий запрос исходит от другой IP).