如何防止代币替换攻击?

时间:2018-12-28 09:03:46

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

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

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

现在我们可以通过任何方式验证令牌吗?

2 个答案:

答案 0 :(得分:1)

您无法避免这种情况。但是,令牌应具有到期时间,因此攻击者只能在该时间内访问。另外,如果您知道令牌已被盗,则可以将其撤消,使其不再有效。

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

答案 1 :(得分:0)

除非经过加密,否则绝不可将诸如OAuth令牌之类的机密信息存储在HTTP Cookies中。加密应特定于客户端/会话,这意味着应为每个客户端会话使用不同的加密密钥。如果入侵者要提取加密的cookie并尝试将其用于其他会话,则解密将使cookie无效。

在您的情况下,用户B获得对用户A会话的访问权限。没有太多保护可用。这类似于您登录银行,离开办公桌喝咖啡,其他人坐下来,开始使用与登录时相同的浏览器窗口进行转帐。

安全性仅与最弱的链接一样强。每个组件都必须实现强大的安全性。如果可以破坏单个组件,那么其他安全组件也可能会失败。

在非常严格的安全性和便利性之间进行权衡。如果这些过程过于繁琐或过于困难,或者只是一意孤行,人们往往会牺牲安全性。

我的银行做了一些有趣的事情。登录并继续执行操作(单击链接,移动鼠标等)后,我将保持身份验证。如果我暂停一分钟,则下次单击链接时,我必须重新进行身份验证。一种有趣的策略,可以检测出可能无人看管的人。