“到处注销”在 PHP 中是如何工作的?

Posted

技术标签:

【中文标题】“到处注销”在 PHP 中是如何工作的?【英文标题】:How does "Logout Everywhere" work in PHP? 【发布时间】:2011-07-01 00:34:25 【问题描述】:

我刚刚发现 *** 有一个链接可以注销每台登录的计算机。

所以..我想过如何在 php 中实现相同的功能。我想出了使用 session_set_save_haldner 来控制 write() 方法。在 write() 方法中,我可以使会话文件以用户的用户名开头。例如,用户 john 可能有会话文件 john_kdkajdkak 和 john_29039dla。当 John 单击“Logout Everywhere”时,我可以编写一个代码来查找以“john”开头的文件名,然后删除它们以清除会话。

还有其他更好的解决方案吗?如果您已经实现了它,您是如何实现它的?

【问题讨论】:

更简单的方法是不使用 PHP 会话来跟踪谁登录了。自己实现相对容易,并且会给你一个可靠的方法来做到这一点。您至少应该使用数据库表或类似的东西而不是文件来支持这一点。 @Billy ONeal,最好使用 PHP 会话,但要更改会话的cookie 名称。 Roll-your-own 会话有各种安全隐患和风险,但更改 cookie 名称相对没有意义,并且将其与数据库表中的用户帐户关联起来非常容易。 “有各种安全隐患和风险” 如果您知道自己在做什么,则滚动您自己的会话管理的安全风险是最小的。对于许多项目来说,现有的 PHP 会话管理已经足够好了——你最好把时间花在其他任务上。 【参考方案1】:

使用数据库来保存会话数据。

使用session_set_save_handler,您可以为用户会话滚动您自己的数据库存储后端 - 一个具有user_id 外键的sessions,与users 表相关。 “到处注销”按钮将触发简单的DELETE FROM sessions WHERE user_id = 1234 并使用户的每个会话无效。

您还可以轻松地在 session 表中添加其他列 - 例如,存储会话的 IP 地址,以便用户可以查看其他会话的登录位置。

使用数据库以获得灵活性和性能。

【讨论】:

数据库会话比文件系统会话快吗?? 是的 - 虽然主要好处是灵活性和可扩展性。【参考方案2】:

如果您在同一个域上有多个站点,就像 StackExchange 一样,那么您可以使用 PHP 来做到这一点。

正如比利已经指出的那样,更好的做法是为此使用数据库存储。

在您的情况下,我会考虑使用 CAS 或类似的解决方案。

但这一切都归结为您将使用同一个帐户拥有多少个不同的网站。

【讨论】:

@degiga // 我的问题与同一域上的多个站点无关。当您在 *** 上单击“注销”时,您将看到以下引用。 “如果您通过多台计算机登录 Stack Overflow 并希望全部退出,或者您使用的是公共计算机,请单击下方。”

以上是关于“到处注销”在 PHP 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 的“未设置”构造如何在内部工作?

如何使 SQL Server 2012 与 php 一起工作?

组合在 Hibernate 中是如何工作的?

reduce() 方法在 Java 8 中是如何工作的?

继承在 Ruby 中是如何工作的?

闭包在方法 mapValues 中是如何工作的?