基于散列片段的安全性究竟是如何工作的?
Posted
技术标签:
【中文标题】基于散列片段的安全性究竟是如何工作的?【英文标题】:How exactly hash fragment based security works? 【发布时间】:2014-11-04 02:44:25 【问题描述】:我正在学习 OAuth 2.0,但无法在隐式授权流程中获得保护访问令牌的方法。规范中有一些论文和一些赞成的 SO 答案看起来相互矛盾。有人可以清除它吗? SO答案和规范中的引述让我感到困惑:
-
(来自规范)用于将访问令牌传递给客户端的重定向 URI。这
访问令牌可能会暴露给资源所有者或其他
有权访问资源所有者的用户代理的应用程序。
(来自规范)访问令牌凭据(以及任何机密访问令牌
属性)在运输和存储过程中必须保密,并且
仅在授权服务器、资源服务器之间共享
访问令牌对其有效,以及访问令牌所在的客户端
发布。访问令牌凭据只能使用 TLS 传输。
(来自accepted and upvoted SO answer)在隐式流程中,访问令牌作为散列片段传递,只有浏览器知道散列片段。浏览器会将哈希片段直接传递到目标网页/重定向 URI,即客户端网页(哈希片段不是 HTTP 请求的一部分),因此您必须使用 javascript 读取哈希片段。中间服务器/路由器无法截获哈希片段(这很重要)。
我的问题:
P1 表示令牌通过重定向 URI 传递给客户端,而 P2 表示传递通道必须是 TLS-ed。但是 P3 说 散列片段没有发送到网络。如果访问令牌没有发送,因为它是哈希片段,它如何到达客户端?无论如何,它必须通过网络发送不是吗?或者使用重定向 URI 发送令牌会在没有网络交易的情况下产生一些魔力?
唯一可能的解释 - 在引擎盖下浏览器仅通过网络发送 url 的非散列部分,并且在加载新页面后,只需插入散列片段并使其可用于 JS。如果我是对的,我仍然无法理解我们为什么不简单地发送带有 可靠、安全的 HTTPS 通道 作为响应参数的令牌?
【问题讨论】:
【参考方案1】:OAuth 提供者通过 HTTP 响应重定向将访问令牌发送回 OAuth 消费者:
HTTP/1.1 302 Found
Location: https://consumer.org/redirect_uri#access_token=1111-2222-3333-4444
注意访问令牌是如何通过网络发送的,作为来自 OAuth 提供者的 HTTP 响应的一部分,除了消费者之外,它也应该在 HTTPS 上。
然后,您的浏览器将对消费者端点执行新的 HTTP GET 请求:
GET /redirect_uri HTTP/1.1
Host: consumer.org
请注意访问令牌如何不通过网络发送给消费者。 consumer.org
的服务器将不会收到此 HTTP 请求中的令牌。相反,从https://consumer.org/redirect_uri
返回的网页将包含能够并且将从 url 片段中读取访问令牌的 javascript。
因此,您需要信任从 consumer.org 收到的 javascript 代码(通过使用 HTTPS),因为如果攻击者可以注入代码,它还可以间接获取访问令牌(并将其发送到任何地方)。
来自消费者的 HTTP 响应示例:
200 OK
Content-Type: text/html
<html><head><script>
alert(window.location.hash)
</script>
</head><body></body></html>
【讨论】:
关于恶意软件 JS 代码和 HTTPS - 是的,客户端上的 HTTPS 设置可能解决了糟糕的 JS 问题,但不是为非 HTTPS 客户端发明的散列片段魔法吗?如果 hash-fragment 不能完全防御像 bad JS 这样的攻击,那么简单地在客户端使用 HTTPS 并将令牌作为请求参数发送不是更好吗? 不,隐式授权流程不适用于非 https 客户端,它适用于没有后端的客户端。没有将令牌作为请求参数发送的流程。与隐式授权流程相比,授权代码流程将code
作为查询字符串参数提供给客户端后端。客户端后端然后用令牌交换代码(使用客户端凭据的经过身份验证的请求)
原来的重定向响应,在#之后有token,因为收到302后,浏览器正在发出新的GET请求,对吧? 1. 在对 consumer.org/redirec_uri 的 GET 请求中,如果未发送作为令牌的哈希后的部分,那么当 consumer.org 返回 JS 时,JS 将在哪里找到这个“令牌”,因为使用的 URL现在检索这个 JS 没有令牌? 2. 如果 IDP(OAuth) 提供商在重定向 URL 中返回了令牌,那么这不是暴露在互联网上吗?还是响应头没有暴露在互联网上?以上是关于基于散列片段的安全性究竟是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章