基于散列片段的安全性究竟是如何工作的?

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 中返回了令牌,那么这不是暴露在互联网上吗?还是响应头没有暴露在互联网上?

以上是关于基于散列片段的安全性究竟是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

会话劫持在 PHP 中究竟是如何工作的?

导致阿里云被暂停合作的漏洞究竟是什么?

Sharkscope 或 PTR 数据究竟是如何挖掘所有这些手的?

!function()() 究竟是如何工作的? [复制]

尾递归究竟是如何工作的?

泛型究竟是如何工作的?