【问题标题】:How to prevent token substitution attack?如何防止令牌替换攻击?
【发布时间】:2019-05-26 03:04:51
【问题描述】:

假设我们有两个用户在做以下操作 -

  1. User1 向身份验证服务器请求访问令牌,并且也被授予。
  2. 现在 user1 将令牌保存到 localstorage/cookie 中以供将来 api 访问。
  3. 现在 User2 接近 User1 浏览器并通过某种方式获取 access_token。
  4. 现在 User2 使用 user1 的 access_token 调用 api 并且无需登录也可以获得访问权限。

现在我们可以验证令牌了吗?

【问题讨论】:

  • @name John Hanley 你能建议一下吗

标签: java spring oauth access-token openid-connect


【解决方案1】:

你无法避免这种情况发生。但是,令牌应该有一个过期时间,因此攻击者只能在该时间段内访问。此外,如果您知道令牌已被盗,您可以将其撤销,使其不再有效。

您可以应用更多的安全措施,例如将令牌与特定 IP 地址相关联,或者使用一些甚至使用机器学习来检测异常行为的高级服务。

【讨论】:

  • 我认为我们可以通过在服务器端管理会话并使用会话令牌检查传入令牌来进行管理,但是在每次请求时我都必须调用用户端点。
  • 在访问敏感信息之前,您还可以要求用户再次输入凭据,例如在更改密码之前。
  • 请注意,客户端的 IP 地址可能会在会话期间发生变化。特别是如果它是一个移动客户端。
【解决方案2】:

除非加密,否则不得将 OAuth 令牌等机密信息存储在 HTTP Cookie 中。加密应该是客户端/会话特定的,这意味着每个客户端会话应该使用不同的加密密钥。如果入侵者提取加密的 cookie 并尝试将其用于不同的会话,则解密将失败,从而导致 cookie 无效。

在您的场景中,用户 B 获得对用户 A 会话的访问权限。没有太多的保护可用。这类似于您登录银行,离开办公桌去喝咖啡,然后其他人坐下来使用您登录的浏览器窗口开始转账。

安全性取决于最薄弱的环节。每个组件都必须实现强大的安全性。如果单个组件可能被破坏,那么其他安全组件也可能会失败。

在非常严格的安全性和便利性之间需要权衡取舍。如果过程太乏味或太困难或只是碍事,人类往往会牺牲安全性。

我的银行做了一些有趣的事情。一旦我登录并继续做事(点击链接、移动鼠标​​等),我就会保持身份验证。如果我暂停一分钟,那么下次我单击链接时,我必须重新进行身份验证。检测可能无人看管办公桌的人的有趣策略。

【讨论】:

  • 使用 jwt 将避免加密,我无法在构建 SPA 应用程序时使用客户端会话进行加密。
  • 这对 SPA 产生了影响。这意味着用户直接向 Google 进行身份验证,而不是通过(通过)您的网站。您无法控制令牌,令牌的安全性取决于用户。用户只能授予自己访问他们拥有/控制的数据的权限。
  • JWT 未加密。它由帐户的私钥签名以防止更改。
  • 不,我是发行令牌的人,正如gbandres建议的那样,我们可以添加主机相关信息并在应用程序端进行验证。
  • 您如何通过 SPA 实现这一目标? SPA 在客户端的浏览器中运行,这意味着您无法做任何我在一两分钟内无法弄清楚的秘密(例如安全性)。相反,如果您的意思是使用无服务器来获得计算能力...
猜你喜欢
  • 2015-09-28
  • 2021-10-13
  • 2013-12-07
  • 2014-01-02
  • 2017-03-31
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多