【问题标题】:How to sign out users on manual refresh [closed]如何在手动刷新时注销用户[关闭]
【发布时间】:2014-09-23 03:46:25
【问题描述】:

如果用户手动刷新页面或单击返回按钮而不是单击提供的菜单,我想知道某些应用程序如何注销用户。我在印度的许多银行应用程序中都看到了这种情况。 经过思考,我想到的一个解决方案是,对于每个登录的用户,我可以存储当前会话 ID 和下一个会话 ID,并在 url 中传递会话 ID。因此,现在如果用户刷新页面并且会话 ID 不是下一个会话 ID,那么我们可以简单地将它们注销。所以我能做的是,如果在 url 中找到下一个会话 id,那么我可以手动设置当前会话 id。

但是从编程的角度来看,这可能会很忙,因为我必须在每个 url 中为呈现的页面设置下一个会话 id,我担心这是否会造成安全威胁?

对此有什么想法吗?

【问题讨论】:

  • 不要将 session_ids 放在 URL 中。这可能导致会话劫持
  • @DarkBee 与其说它会导致会话劫持(在 cookie 中存储会话 ID 具有相同的风险),不如说它可能导致某人共享指向特定页面的链接并意外地通过它分享他们的会话ID。

标签: php security session


【解决方案1】:

基本上是的,这就是你要做什么。出于安全目的,您永远不应在 URL 中传输会话 ID,将其保留在 cookie 中。但是,您可以在用户的​​会话中保存一个随机令牌:

$_SESSION['token'] = uniqid(null, true); // quick prototype, not the best method

然后您将这个令牌嵌入到页面上的每个 URL 中:

<a href="someMenuItem.php?token=<?php echo $_SESSION['token']; ?>">

然后在每个页面加载时,检查标记是否相同。如果是,则生成一个新的随机令牌;否则你会破坏用户的会话。

说了这么多……

这是一个可怕的想法!!!

这对用户非常不友好。刷新页面或向后移动是 Web 上的正常交互范式。有时这是必要的事情,例如如果网络连接不好并且只加载了一半的页面,您需要重新加载它。如果您实施此类限制,您正在积极地使您的页面无法使用。这可能提供的任何安全优势在很大程度上都可以通过其他方式获得,没有必要这样做。见PHP Session Fixation / Hijacking

【讨论】:

  • 是的,这听起来不错。我可以分配诸如令牌之类的东西,然后匹配它,而不是存储 id。就需求而言,我在我的问题中已经说过我在许多应用程序中都看到过它,所以我认为我应该讨论它。另外我认为,与其将令牌存储在会话中并每次都匹配,不如将其存储在数据库中,因为会话值始终可以读取,因此需要额外的开销。
  • 您最后关于会话与数据库的评论毫无意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 2012-04-24
  • 2020-04-05
  • 1970-01-01
  • 2016-05-09
  • 2017-12-28
相关资源
最近更新 更多