远程销毁 php 中的会话(用户在其他地方登录)?

Posted

技术标签:

【中文标题】远程销毁 php 中的会话(用户在其他地方登录)?【英文标题】:Remotely destroy a session in php (user logs in somewhere else)? 【发布时间】:2011-07-23 12:51:58 【问题描述】:

嘿,当同一个用户在其他地方登录时,我正试图让我的 php 网站基本上“注销”(session_destroy())。有没有办法做到这一点?远程销毁特定会话?

谢谢大家!

斯科特

【问题讨论】:

其他地方是什么意思?在您的网站中,但另一个浏览器是您的意思吗? 【参考方案1】:

我想建议我们可以做的是,获取时间并添加一些附加值(如 manu1234567)并在用户登录时存储在数据库中。 在会话中添加它。 现在在每一页上比较两者,如果相等则继续,否则转发到另一页或给出一些消息。

现在其他部分 当另一个用户使用相同的用户名和密码登录时,数据库将更新 对于第一人称,会有错误消息“有人从其他地方登录。”

注意:时间总是不同的。所以两个值相同的可能性会非常小。

【讨论】:

在每个页面上进行查询有点低效。我认为@Jon 更好,因为只需要检查登录。【参考方案2】:

不必创建自己的会话处理程序。

只需在登录时将会话 ID 和用户名存储在数据库中。

每次用户获取页面时,将该用户的会话 ID 与存储的会话 ID 进行比较。

如果会话 ID 不匹配,则表示用户已在其他地方登录,您应该自毁。

【讨论】:

这比我在 Jon 的建议下的想法还要好!谢谢你们! 这需要在每次加载页面时执行一次查询。 @Jon 只检查登录。 @ESL 这很可能是有利的。它将允许远程会话“强制注销”以检查每个页面请求。只有检查登录才会允许远程会话正常进行,直到下次注销。【参考方案3】:

除了 Jon 的回答(很棒,+1)之外,您还可以做的另一件事是首先检查用户来自哪里(引荐来源网址),如果用户来自您自己以外的其他网页,则销毁会话。

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

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

source

【讨论】:

【参考方案4】:

最好的方法是创建自己的会话处理程序,如果您可以完全控制会话的存储/检索和控制方式,那么强制注销并不难,它为您提供了广泛的有用功能。如果你有时间。

但是,为了更快的解决方案:将来自 PHP 的会话 ID 与用户一起存储在数据库中,并在您的 isLoggedIn 函数或任何您使用的函数中检查它。如果不匹配,请强制注销。

【讨论】:

【参考方案5】:

当然可以,使用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

这将破坏服务器端的旧会话,因此当另一台计算机再次访问您的应用程序时,它将尝试访问一个不存在的会话并为其创建一个新会话(其中用户未登录不再)。

困难的部分是找出“旧”会话的 ID 是什么。没有一种万能的方法。您需要有一些机制来判断 id 为 XXX 的会话属于现在登录的同一用户。如果您使用的是数据库会话,这应该很容易。

【讨论】:

说实话,我想我会用这个!我想也许我要做的是登录,将会话存储在数据库中的用户行中。然后检查登录时是否已设置,如果是,请使用您建议的代码销毁该会话,并将数据库中的会话 ID 替换为新的。感谢您的帮助! @dieselpower44:这可行。但要小心:如果用户 A 的会话在用户未显式注销的情况下过期,则数据库中的行将包含旧的会话 ID(您将没有机会删除它)。该会话 id 将来可能会被用户 B 重用,因此当用户 A 再次登录时,您最终可能会将用户 B 注销。不太可能,但请注意,这不是万无一失的方法。 Downvoter:如果您发现它有缺陷,请帮助我改进此答案。谢谢。 我在想也许可以解决你提到的这个问题,在数据库中的每个用户行中为他们登录的 UNIX 时间添加一个额外的字段,并将其添加为会话变量。登录时,检查会话 ID 和 UNIX 时间,如果两者不同,则 session_destroy();感谢您的帮助:) 有点晚了,但这是完全可靠的解决方案 - php.net/manual/en/function.session-destroy.php#114709【参考方案6】:

我可以想象您可以通过使用自己的会话处理来做到这一点。如果您将会话存储在数据库中,您可以根据需要从其他应用程序中删除它们。您可以通过用户名或类似名称来识别用户。

【讨论】:

以上是关于远程销毁 php 中的会话(用户在其他地方登录)?的主要内容,如果未能解决你的问题,请参考以下文章

注销按钮上的 PHP 会话销毁

Laravel - 在登录时销毁现有会话

在 PHP 中销毁会话时出错

会话创建和会话销毁事件中的 Spring 安全访问用户详细信息

销毁会话,但保留一个变量集

如何一键销毁php会话