Удаленно уничтожить сеанс в php (пользователь входит в систему где-то еще)? - PullRequest
20 голосов
/ 26 марта 2011

Эй, я пытаюсь заставить мой php-сайт "выходить из системы" (session_destroy ()), когда тот же пользователь входит в систему где-то еще. Есть ли способ сделать это? Чтобы удаленно уничтожить конкретную сессию?

Спасибо, ребята!

Scott

Ответы [ 6 ]

27 голосов
/ 26 марта 2011

Это, конечно, возможно, используя session_id.Когда пользователь входит в систему где-то еще, вы можете выполнить этот шаг перед началом нового сеанса для нового имени входа:

// The hard part: find out what $old_session_id is

session_id($old_session_id);
session_start();
session_destroy();

// Now proceed to create a new session for the new login

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

Сложная часть заключается в том, чтобы выяснить, что является идентификатором"старая" сессияНет единого способа сделать это;у вас должен быть какой-то механизм, позволяющий определить, что сеанс с идентификатором XXX принадлежит тому же пользователю, который сейчас входит в систему.Если вы используете сеансы базы данных, это должно быть достаточно просто.

3 голосов
/ 26 марта 2011

Нет необходимости создавать свои собственные обработчики сеансов.

Просто сохраните идентификатор сеанса с именем пользователя в базе данных при входе в систему.

Каждый раз, когда пользователь выбирает страницу, сравнивайте идентификатор сеанса этого пользователя с сохраненным идентификатором сеанса.

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

1 голос
/ 26 марта 2011

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

0 голосов
/ 06 июля 2013

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

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

Примечание: время всегда будет другим.поэтому будет очень очень мало шансов, что два значения будут одинаковыми.

0 голосов
/ 26 марта 2011

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

$referer = $_SERVER['HTTP_REFERER'];
$referer = parse_url($referer);

if($referer['host'] != "yoursite.com" || $referer['host'] != "www.yoursite.com") {
     session_destroy();     
}

источник

0 голосов
/ 26 марта 2011

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

Но для более быстрого решения: сохраните идентификатор сеанса из PHP в базе данных с пользователем и проверьте это в вашей функции isLoggedIn - или как вы используете. Если он не совпадает, принудительно выйдите из системы.

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