Oauth 2.0 隐式授权有多安全?

Posted

技术标签:

【中文标题】Oauth 2.0 隐式授权有多安全?【英文标题】:How secure is Oauth 2.0 Implicit Grant? 【发布时间】:2012-12-27 04:40:13 【问题描述】:

在隐式授予中,访问令牌在回调 URL 中发回。这不是安全风险吗,因为如果此回调 URL 缓存在跃点中。一般来说,建议不要在 URL 参数中发送敏感数据,并且此访问令牌将是访问所有受保护用户资源的令牌。那么为什么它在 URL 中作为片段传递

【问题讨论】:

【参考方案1】:

嗯,恐怕上面的答案有一些误解。虽然使用 TLS 时 URL 查询字符串是安全的,因此访问令牌在飞行中受到保护,但它会暴露在用户浏览器(他们历史的一部分)以及目标 Web 浏览器日志中。大多数 Web 浏览器都会记录传入请求的整个 URL。它们是一个称为“引用”泄漏问题的附加问题,其中查询字符串将被传递到第三方站点。可以在以下位置找到一个很好的概述:

http://blog.httpwatch.com/2009/02/20/how-secure-are-query-strings-over-https/

【讨论】:

vlatko - 你说 URI 片段有一些特殊属性是正确的,所以严格来说我上面的 cmets 不适用。然而,这是消息交换的一个非常脆弱的方面——你实际上是依赖于浏览器在重定向上的特定行为来保护流(它在重定向上省略了 URI 的片段组件)。如果 URI 片段确实在某个地方被拾取,它会为攻击者生成一个多用途令牌。 你是完全正确的。根据定义,这种类型的身份验证是不安全的。【参考方案2】:

详细说明@vlatko 的回复...

为了降低在片段中发送令牌的风险(或通过任何其他 OAuth2 授权):

确保 OAuth 端点和回调端点是 TLS (https)(参见 countermeasures) 发送state parameter 以防止跨站点伪造(另见:https://www.rfc-editor.org/rfc/rfc6749#section-4.2.1)

发行短期访问令牌(如@vlatko 所说)将减少令牌泄露的影响,但不是预防措施。

【讨论】:

即使通过https发送访问令牌,由于它是一个片段,网络中的中间跃点服务器不可能嗅探它。 你的意思是即使它是通过http发送的? 如果我们假设 Oauth Server 为 X,请求访问的客户端为 Y。那么即使访问令牌在 https 中作为片段发送,从 X 到 Y,www 网络中的中间机器从 X到 Y 可以读取此访问令牌(即:窃听 https 查询参数/片段就像窃听 http 查询参数/片段一样简单)。在 https 的情况下,只有 HTTP 正文中的数据会被加密。 查看这些问题:***.com/questions/8858102/…***.com/questions/499591/are-https-urls-encrypted 感谢您的解释【参考方案3】:

正如您所指出的,令牌是通过 URI 片段传递的。由于浏览器不会将 URL 片段发送到 HTTP 服务器,因此有人窃听并获取访问令牌的机会大大降低。

还有其他安全措施,例如在隐式授权流程中仅发布短期访问令牌。

OAuth2 threat models document 中的更多信息。

【讨论】:

即使通过https发送访问令牌,由于它是一个片段,网络中的中间跃点服务器不可能嗅探它

以上是关于Oauth 2.0 隐式授权有多安全?的主要内容,如果未能解决你的问题,请参考以下文章

关于OAuth 2.0存在第三方帐号快捷登录授权劫持漏洞的安全公告

安全预警关于OAuth 2.0存在第三方帐号快捷登录授权劫持漏洞

授权与认证OAuth 2.0 和 OIDC 的异同点

OAuth授权码流安全问题(授权码被黑客截获)

OAuth 2.0学习

oauth 隐式授权与授权码授权?