保持用户会话活动 - 安全注意事项

信息安全 Web应用程序 验证 会话管理
2021-08-31 13:17:05

我们最近为我们的 Web 应用程序开发了一些功能,以允许用户无限期地保持登录状态,并且有兴趣了解这样做的安全后果。这样做的目的是防止用户在编辑页面的时间过长时丢失数据 - 以前,一旦会话过期,他们就必须复制/粘贴到剪贴板,因为 POST 将被阻止并且登录是在不同的屏幕上处理的.

因此,我们现在检测用户会话是否接近到期,然后向他们展示一个允许他们单击按钮以保持会话活动的模式。如果他们长时间忽略此警告模式,我们会在他们的会话实际到期后立即将其替换为“重新登录”模式。

第一个模式/警告机制通过 AJAX get 调用服务器运行,该服务器返回注销前的时间。如果时间少于 15 分钟,我们打开“让我登录”模式,它有两个选项 - 立即注销或保持登录状态。显而易见,保持登录状态需要另一个 AJAX 再次访问服务器,这刷新用户的身份验证 cookie。

第二种模式更复杂 - 模式阻止与页面的进一步交互,并且只有在正确的密码重新输入时才会被删除。我们知道模态不会真正保护从页面读取数据,但这是需求的本质。

用户重新登录所需的数据(例如用户名和以前的角色)以纯文本形式存储在模式内的隐藏输入字段中。我们考虑过对此进行散列处理,但似乎并没有必要——用户名不是特别重要,并且在重新登录时会重新评估请求的角色;如果您尝试“调整”POST,则无法将自己升级为无权访问的角色。

我们考虑过的最坏情况是有人使用不同但有效的用户名/密码编辑 POST 并以其他人身份登录,同时仍留在页面上。他们将能够阅读该页面,但无论如何他们都可以这样做 - 导航离开将使他们返回到“新”登录的正确屏幕。我们可能需要做一些工作来确保在这种情况下所有 POST 都被阻止,但还有什么需要考虑的吗?通过再次手动输入用户名来强制用户重新识别有什么好处吗?

Web 应用程序是 ASP.NET MVC3。

更新

感谢您迄今为止的反馈。

我们已经接受了不信任来自客户端的数据,因此我们决定将用户名和角色一起加密,然后在登录尝试时解密。从那以后我们发现,由于我们已经实施了 AntiForgeryToken 保护措施,如果其他用户要登录,那么任何发布操作都将无法通过验证。

我们认为弹出窗口不会出现重大的可用性问题,因为超时当前设置为 60 分钟,并带有 15 分钟的警告。我们已经考虑到滑动过期直到中途才更新(http://msdn.microsoft.com/en-us/library/system.web.configuration.formsauthenticationconfiguration.slidingexpiration.aspx)。重要的是要记住,这一切都是为了解决用户对丢失数据的抱怨——他们在我们的系统上输入了大量的文本,这可能很耗时,并且会话在完成之前很有可能会过时。

稍后要添加的另一个功能是处理用户更改输入字段并向服务器发送心跳(除非它们已经未经身份验证)。我们还没有决定如何处理这个事件或触发心跳,以便它不会触发每次按键。一旦这到位,超时警告对话框的显示频率应该会降低。

可能值得一提的是整个站点都是 HTTPS,我们使用 ASP.Net AntiForgeryToken,它们是标记为安全的 HttpOnly Cookie。

如果有人有任何进一步的反馈或建议,很高兴收到您的来信。

2个回答

在这种方法中,我闻到了两种“难闻的气味”:

  • 首先,你永远不应该相信客户。将用户名存储在客户端,然后信任客户端诚实地将其发回,这对我来说并不明智。您已经发现这可能允许某人以不同的用户名访问单个页面。这听起来有点可疑,你怎么知道没有更糟糕的攻击?我建议不要使用任何涉及信任客户的方案,即使只是一小会儿。

  • 其次,这听起来有问题。弹出对话框打断你的流程真的很烦人。要么切断他们的会话,要么不。就个人而言,对于大多数网站,我认为如果他们打开一个标签页,长时间保持会话打开并没有太大的危险,而且我认为不强迫用户重新登录的可用性好处是值得的安全风险,但由您决定。我唯一的建议是避免弹出对话框打断你的流程。当然,我不是可用性方面的专家。如果您想要更专业的意见,您可以在User Experience.SE上提问。

    更新 (11/14): 我知道您添加对话框是有原因的,但我仍然认为从可用性的角度来看,它可能不是最好的解决方案。如果解决方案是数据输入过程中的用户丢失了数据,那么还有其他解决方案似乎具有更好的可用性。示例:您可以使用 Javascript 让 Web 应用程序每 30 秒自动保存他们输入的文本,这样如果他们的会话超时,他们可以重新登录并重新出现他们的文本。或者,您可以延长会话的长度。或者,您可以检测任何选项卡上的用户活动(打字等),并且仅在用户不活动 60 分钟后使会话过期。询问用户体验人员也可能会导致其他建议。我意识到这与该站点无关,因此我将保留它。

我不会立即发动攻击,破坏你的计划并将其撕成碎片。但是这些“难闻的气味”让我有些担心,让我觉得您没有遵循 Web 应用程序中防御性设计的良好实践。

  • 保持用户会话安全。至于负载,这取决于您的硬件以及您如何编写它,但它的效果并不比用户刷新页面更糟糕(考虑到 AJAX 调用相对于标准页面加载的开销可能更少)。
  • 如果这是您所要求的,您可以在 web.config 中调整超时...
  • Cookie 有其用途,我认为只要它是您的域,它们就可以接受,但确实意识到有些人禁用了它们,因此归结为有一个后备方案。
  • 将 .NET AJAX 与 UpdatePanel 一起使用时,存在服务器端回发。唯一的区别是没有加载整个页面。所有的服务器端代码都是正常触发的,但是信息是使用 AJAX 技术以不同的方式在服务器和页面之间发送的。
  • 您甚至可以使用 .NET 调用 PageMethods 的机制从客户端 JavaScript 调用服务器端方法。与传统的 UpdatePanel 技术相比,这是在 .NET 中使用 AJAX 的一种更“手动”的方式。
  • 银行在您检查财务时使用相同的方法来保持您的会话继续进行,但通常会在您之前提供一个弹出窗口询问您是否要继续。
  • 让用户强制登录的时间超过正常持续时间可能会带来安全风险(想象有人在图书馆或学校计算机上登录并离开办公桌——如果该会话持续到第二天

以下资源可能对您有所帮助