只清除 cookie 而不是注销有什么风险?

信息安全 验证 饼干
2021-09-03 09:56:19

典型的 Web 身份验证工作流程如下所示:

  1. 用户提供他们的凭据。
  2. 服务器验证凭据。
  3. 如果凭据有效
    • 服务器生成一个令牌。
    • 服务器保留此令牌。
    • 服务器使用此令牌响应登录。
  4. 浏览器存储令牌。
  5. 浏览器使用令牌发出请求。
  6. 服务器验证令牌并做出相应的响应。

通常,此令牌存储在 cookie 中。请求中令牌的存在和有效性让服务器知道发出请求的客户端是否经过身份验证。没有令牌,没有条目,这实际上与未登录相同。所以...

  • 我可以通过擦除cookie而不是注销来注销吗?
  • 仅擦除 cookie 与单击注销按钮有什么问题?
4个回答

我可以通过擦除cookie而不是注销来注销吗?

通常是的,因为您在问题中提供的原因:如果 cookie 中没有会话令牌,典型的 Web 应用程序将不知道您是谁。

仅擦除 cookie 与单击注销按钮有什么问题?

当您明确注销时,按照OWASP 会话管理指南管理身份验证的 Web 应用程序将使服务器端的会话无效。如果您只是简单地丢弃带有会话令牌的 cookie,则会话可能会受到会话劫持。

对于那些不熟悉开发 Web 应用程序的最佳实践的人来说,使用门锁作为类比(感谢评论中的讨论):

您的帐户可以被视为建筑物中的一个房间。当您登录时,建筑物的所有者会创建一扇门并在其上自动锁上,这样只有您可以进入。您的会话令牌是您的密钥,通常存储在浏览器的 cookie 中,但也可以存储在其他地方。

通过删除 cookie、清除缓存等来丢弃您的令牌,只是破坏了您的密钥副本。

明确注销是要求建筑物所有者用砖砌门口。无法保证他们会保护您的帐户,但作为用户,您明确表达了您的意愿。

攻击者可以通过多种方式获取您的密钥副本,称为会话劫持,这是网站所有者而不是用户的责任。

首先,攻击者只能猜测。如果站点按顺序生成会话密钥,或者使用低熵伪随机生成方法,这会使猜测变得更加容易。站点通过使用高熵令牌和定期会话回收来缓解这种情况。回收会话不会阻止访问,但在授予未经授权的访问时会很明显。

其次,攻击者可以使用会话固定:他们在您登录之前给您一个密钥,您在登录后继续使用它。站点通过在您登录时显式回收会话来缓解这种情况。

第三,中间人攻击。攻击者可以直接看到您的密钥。TLS 缓解了这一点。可以通过降级攻击、不安全的实现和零日攻击来解密 TLS 流量,但这些都远远超出了用户的域,针对 TLS 的罕见和零日攻击在被发现时往往会引发很多噪音(心脏出血等)。

作为用户,您的责任是在站点安全地走捷径时注销并追究该站点的责任,就像您在公共停车场的汽车责任是锁门一样。如果门锁被轻而易举地绕过,那是制造商的错,而不是你的错。

一些网站使用非基于 cookie 的方法在用户计算机上存储数据,例如 HTML5 本地存储和可能包含敏感信息的 Flash 播放器缓存。

例如,您的电子邮件客户端可能会将您的草稿电子邮件存储在本地存储中,以便在您意外刷新页面/关闭浏览器的情况下,您可以从上次中断的地方继续。当您在精心设计的网站上单击注销按钮时,这些敏感数据通常会被删除,而不会仅通过删除您的 cookie 来删除。

我可以通过擦除cookie而不是注销来注销吗?

是的,由于网络应用程序使用 cookie 来唯一识别您,删除 cookie 将使您退出。

仅擦除 cookie 与单击注销按钮有什么问题?

注销按钮具有特殊用途,因为它发送删除会话的请求并返回响应以删除浏览器中的 cookie。如果您不发送删除会话的请求,则会话在服务器端仍然保持活动状态。会话确实有最长的生命周期,最终会被垃圾收集器删除。

没有风险。

有人指出,这可能会增加会话劫持的风险。但事实并非如此。如果应用程序有会话(有状态),则此会话有超时。会话到期后,没有什么可以劫持的。如果会话处于活动状态,则劫持活动用户会话的机会几乎与“孤立”会话相同。考虑到工具可以快速检测到尝试暴力破解会话 ID 的人的无效会话 ID 的多个请求,服务器端没有额外的风险。

在客户端注销的情况下可能会有更大的风险比删除 cookie 的情况。注销会使会话无效,但可以保留一些其他敏感数据。例如,当您从 Google Mail 注销时,您的用户名仍保存在 cookie 中;当您访问 Google Mail 时,您会看到您的用户名已预先填写。首先,您可能不希望任何人在您背后看到此用户 ID。其次,如果赶时间,您可能会登录到错误的帐户(您的多个帐户)。在其他应用程序中可能会出现类似的问题。当您删除 cookie 时,您确定您的浏览器中没有任何您不知道的内容;您不会对 cookie 中存储的任何数据感到惊讶。因此,实际上在注销的情况下,负面意外的风险高于删除 cookie 的情况。我不得不说,当一个人删除 cookie 时,还应该考虑删除本地存储。

在删除 cookie 的情况下,我看到的一个缺点是服务器将使用稍微更多的资源来保留会话数据,直到会话超时。但是 OP 中的问题是关于客户的风险。所以没有风险。现在大多数应用程序在服务器上都没有状态;注销意味着在这种情况下只是使令牌无效;通常没有资源被会话阻塞。因此,即使是“孤立”会话也不会占用任何额外资源。

要考虑的另一个方面:根据应用程序和互联网连接,注销可能需要相当长的时间,几秒钟。删除 cookie(和本地存储)会立即发生,并且不依赖于服务器和互联网连接。

可能有人会发现我忽略的其他重要观点并批评我的观点。没关系。我只是想鼓励用户不要盲目地遵循任何规则,而是要考虑实际发生的事情。