#php #session
#php #сессия
Вопрос:
Это моя ситуация,
у меня есть 2 сервера, server_1
на которых размещена страница, server_2
веб-приложение. Вы можете войти в веб-приложение server_2
со страницы server_1
, выполнив post-вызов, передающий имя пользователя и зашифрованный пароль, а также параметр, который определяет, заходите ли вы с server_1
страницы или непосредственно из формы входа в веб-приложение на server_2
.
При входе в систему я использую много $_SESSION
переменных для хранения информации о текущем зарегистрированном пользователе и много вызовов ajax непосредственно в php-файл ( req.php
). Теперь, если я вхожу в систему из формы веб-приложения на server_2
, у меня нет проблем, но если я вхожу из server_1
when it’s time to make и вызываю ajax, я не могу правильно получить значение сеанса (только из php кода ajax, остальная часть приложения работает хорошо).
Существует еще одно странное поведение при входе из server_1
. Пример:
User_1
войдите в систему из server_1
, после этого вы используете веб-приложение, закрываете вкладку и возвращаетесь на server_1
страницу, выходите из системы, входите с помощью user_2
, нажимаете динамическую ссылку для входа в server_2
, и веб-приложение создает тот же идентификатор сеанса (я вижу файл ses_randomid в каталоге php), что и предыдущий! Итак, вы украли сеанс другого пользователя…
Я использую в index.php и req.php (файл, используемый для обработки вызова ajax):
session_name("kreker");
session_start();
Когда я отлаживаю вызов из веб-приложения на req.php $_SESSION
переменная также не не устанавливается, если я вызываю session_start()
, и это происходит только в том случае, если вы входите из server_1
. Если вы входите в систему напрямую из веб-приложения, переменная устанавливается!
Пытался вызвать ajax при событии закрытия браузера для принудительного уничтожения сеанса, работает, но я думаю, что это неправильное решение. Я также пробовал с session_regenerate_id()
, теперь результаты;
Итак, проблема в том, что я вхожу в систему через POST
запрос с другого сервера, сохраняю значение сеанса, закрываю браузер без выхода из системы, вхожу через POST
с другими учетными данными, и вы регистрируетесь как предыдущий пользователь! Возможно, это происходит потому, что сеанс server_1
всегда один и тот же? (я имею в виду, что за сеанс вы не закрываете браузер)
Извините, это очень сложно объяснить, надеюсь, вы понимаете
Комментарии:
1. Перед входом пользователя в систему вы должны выполнить session_destroy(), чтобы удалить все его ранее существовавшие сеансы. Вы это делали?
2. Да, но у меня все еще есть проблема, когда я вызываю req.php файл, потому что в этой части сеанс уже запущен, и мне это нужно в этом файле, но если я вызываю session_start(), сеанс не отображается.
3. Я не могу понять часть: «потому что в этой части сеанс уже запущен». Можете ли вы пояснить, почему именно вы не можете вызвать session_destroy() до входа пользователя в систему?
4. Публикация фрагмента кода для соответствующего компонента может помочь.
5. Я могу это вызвать, но это не работает. При входе в систему создается файл для сеанса, при закрытии браузера файл все еще существует на сервере, когда вы меняете имя пользователя с server_1 и login, он использует тот же идентификатор сеанса другого пользователя. Это не создало новый идентификатор, я не понимаю почему. Единственный способ решить эту проблему — принудительно удалить файл сеанса при закрытии браузера с помощью вызова ajax, но я не знаю, правильный ли это способ