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

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

所以..我想过如何在 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 会话管理已经足够好了——你最好把时间花在其他任务上。

标签: php logout


【解决方案1】:

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

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

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

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

【讨论】:

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

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

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

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

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

【讨论】:

  • @degiga // 我的问题与同一域上的多个站点无关。当您在 stackoverflow 上单击“注销”时,您将看到以下引用。 “如果您通过多台计算机登录 Stack Overflow 并希望全部退出,或者您使用的是公共计算机,请单击下方。”
猜你喜欢
  • 1970-01-01
  • 2013-07-15
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2013-07-30
相关资源
最近更新 更多