当服务器处于离线状态时,我该如何销毁一个HTTP-only的cookie?

8

我有一个Web应用程序,通过REST与Web服务器通信,这个Web应用程序可以在公共计算机上运行,并允许多个用户在给定的时间段内登录和注销。

所有的Cookie都是HTTP-only的,这只是一种额外的安全措施,以防止成功的XSS攻击。这意味着必须进行REST调用才能强制注销。

我的担心是,当Web服务器因任何原因崩溃(或变得不可访问,例如某处断开网络电缆)时。当用户点击注销时,实际上没有办法删除Cookie。这意味着用户可能会离开电脑,同时另一个用户可能会在连接恢复或服务器重新启动时继续使用先前用户的帐户。

处理这种用例的典型方法是什么?(诚然不是特别常见的情况)。


在公共计算机上,用户至少应该使用私密浏览器选项卡/窗口...但是假设他们并不都足够了解如何应用这些基本措施,我会检查注销请求的成功情况,并提醒他们注销未成功。 - CBroe
1
此外,缩短会话生命周期可能有助于防止最坏情况的发生。如果您想在一定时间间隔内“ping”服务器以保持会话活动状态,以免给停留在包含大量内容页面上的常规用户带来不便,那么当注销失败时应该停止这样做。(如果因为没有连接而失败,那么影响不大,但也可能有其他原因。)您还可以将缩短会话生命周期作为可选功能提供,例如,在登录表单中添加一个“我正在从公共计算机登录”的复选框... - CBroe
感谢您的有益评论。 - Josh Mc
1个回答

10

如果我被分配了这样的任务,并且停机时间是确定的,我可能会做一些类似于添加第二个cookie的事情,可通过JS进行修改(我们称其为cookiever),其中包含一些值,该值用作HMAC签名中的一部分在http cookie中使用,即(伪代码):

cookiever ||= random
cookie_signature = hex_hmac_sha256(cookie_data + cookiever, "signing_secret")
httponlycookie = urlsafe_base64(cookie_data) + "|" + cookie_signature
set_cookie("httponly", httponlycookie, httponly=True)
set_cookie("cookievew", cookiever)

通常情况下,cookiever将由服务器与httponly cookie一起设置,并用于在每个请求中验证cookie。如果用户要请求注销,则可以使用Javascript将空值写入cookiever,破坏cookie中的签名信息。因此,即使httponly cookie无法被销毁,cookiever cookie也会被销毁,下一次成功请求时,httpcookie将无法验证其HMAC签名,您的服务器将丢弃它并强制用户开始新的会话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接