Uri*_*iel 5 jwt single-page-application auth0
Auth0 提供了大量资源列表,描述了身份验证的最佳实践。其中有一连串建议不要localStorage
用作存储 (JWT) 令牌的手段。
我发现这些点有几个问题:
auth0.getTokenSilently()
他们的 SDK 来获取令牌,但据我所知,攻击者没有任何理由不能自己调用这个方法(即注入另一个 sdk 脚本,使用现有的客户端密钥,并且只是调用getToken 从那里),从而以几乎相同的方式获取令牌,就好像它存储在localStorage
所以我完全同意 OWASP 的建议,不要将敏感数据localStorage
存储在 . 但这只是因为这些东西会允许攻击者扩大攻击范围(访问银行帐户,尝试在其他应用程序中重复使用用户的密码等)。但我很难看出 accessTokens 是如何受此影响的。
虽然我对 Auth0 实现、功能和设计决策了解不多,但从我对 OAuth2 和安全性的一般理解来看,我可以尝试将这些点联系起来。
\n单个建议本身并不能提供足够的安全性或所需的功能,但是当与其他相关建议组合使用时,我们可以实现所需的安全性和行为级别。
\n让我们回顾一下您提出的观点。
\n\n\n从我的角度来看,访问令牌本身并不会扩大攻击范围。如果攻击者可以控制受害者的浏览器,他们可以使用令牌从受影响的浏览器本身执行调用
\n
问题localstorage
是:
localStorage
并且sessionStorage
不跨子域共享。这是 SSO 功能的显示阻止程序(有一些解决方案使用iframe
,但这些看起来更像是解决方法,而不是一个好的解决方案。当使用响应标头 X-Frame-Options 来避免使用 进行点击劫持攻击时iframe
,任何使用 的解决方案都不iframe
可用问题)
XSS 可以将访问和/或刷新令牌发送到攻击者控制的远程服务器,从而允许攻击者冒充用户
\n注意:第 2 点中提到的漏洞可以通过使用发送者受限访问令牌方法来缓解,其中客户端必须证明他们确实拥有该令牌。另一种选择是OWASP 中提到的指纹方法,它需要 cookie。然而,Auth0 似乎没有实现这些。因此,避免的建议localstorage
是有道理的。
\n\nAuth0 建议使用其 SDK 中的 auth0.getTokenSilently() 来获取令牌,但据我所知,攻击者应该没有任何理由无法自己调用此方法
\n
正确的。这就是为什么
\ngetTokenSilently()
方法要求您Allow Skipping User Consent
在仪表板的 API 设置中启用。虽然我没有看到这方面的具体指南,但我认为如果您将令牌存储在 cookie 中,则不需要启用此选项,从而消除了滥用该方法的任何可能性。\n\n我知道 XSS 无法访问令牌的唯一方法基本上是使用 httpOnly cookie,但这会自行创建新向量 (CSRF),并且仍然无法阻止攻击者从受影响的内部调用 api浏览器
\n
真的。但您可以通过以下一种或多种方法的组合来缓解这种情况:
\nSameSite
cookie。请参阅此处的文档。如果浏览器不支持SameSite
cookie,请按照下面的另一种方法Strict-Transport-Security: max-age=<expire-time>; includeSubDomains\xe2\x80\x8b
为仅允许安全连接,以防止任何中间人覆盖来自子域的 CSRF cookie 归档时间: |
|
查看次数: |
1045 次 |
最近记录: |