问题 基于哈希片段的安全性如何工作?


我正在学习OAuth 2.0,无法获得保护访问令牌的方法 隐式授权流程。规范中有一些论文和一些看起来相互矛盾的SO答案。有人可以清理一下吗?来自SO答案和规范的引言令我感到困惑:

  1. (来自规范)用于将访问令牌传递到客户端的重定向URI。该 访问令牌可能会暴露给资源所有者或其他人 可以访问资源所有者的用户代理的应用程序。
  2. (来自规范)访问令牌凭据(以及任何机密访问令牌) 在运输和储存过程中必须保密 只在授权服务器之间共享资源服务器 访问令牌对于访问令牌所属的客户端是有效的 发行。访问令牌凭证必须仅使用TLS传输。
  3. (从 接受和赞成SO答案)在隐式流中,访问令牌作为哈希片段传递,只有浏览器知道哈希片段。浏览器会将哈希片段直接传递到目标网页/重定向URI,即客户端的网页(哈希片段不是HTTP请求的一部分),因此您必须使用Javascript读取哈希片段。哈希片段不能被中间服务器/路由器拦截(这很重要)。

我的问题:

P1表示通过重定向URI和P2传递给客户端的令牌表示传递通道必须是TLS编辑的。但P3说 散列片段不发送到网络。如果访问令牌没有发送,那么它是如何到达客户端的,因为它是哈希片段?无论如何,它必须通过网络发送不是吗?或者使用重定向URI发送令牌可以在没有网络交易的情

唯一可能的解释 - 在引擎盖下浏览器仅通过网络发送url的非哈希部分,并且在加载新页面之后,只需插入哈希片段并使其可用于JS。如果我是对的,我仍然无法理解为什么我们不简单地发送令牌 可靠,安全的HTTPS通道 作为响应参数?


5486
2017-09-10 12:34


起源



答案:


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(通过使用HTTPS)收到的javascript代码,因为如果攻击者可以注入代码,它也可以间接获取访问令牌(并将其发送到任何地方)。

来自消费者的HTTP响应示例:

200 OK
Content-Type: text/html

<html><head><script> 
    alert(window.location.hash) 
</script>
</head><body></body></html>

9
2017-09-11 11:58



关于恶意软件JS代码和HTTPS - 是的,可能客户端上的HTTPS设置解决了糟糕的JS问题,但是没有为非HTTPS客户端发明的散列片段魔法?如果hash-fragment无法完全防御恶意攻击,那么简单地在客户端上使用HTTPS并将令牌作为请求参数发送是不是更好? - Baurzhan
不,隐式授权流不适用于非https客户端,它适用于没有后端的客户端。没有将令牌作为请求参数发送的流程。与隐式授权流程相反,授权代码流程提供了 code 作为客户端后端的查询字符串参数。然后,客户端后端使用令牌交换代码(使用客户端凭据进行身份验证的请求) - Andreas Åkre Solberg


答案:


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(通过使用HTTPS)收到的javascript代码,因为如果攻击者可以注入代码,它也可以间接获取访问令牌(并将其发送到任何地方)。

来自消费者的HTTP响应示例:

200 OK
Content-Type: text/html

<html><head><script> 
    alert(window.location.hash) 
</script>
</head><body></body></html>

9
2017-09-11 11:58



关于恶意软件JS代码和HTTPS - 是的,可能客户端上的HTTPS设置解决了糟糕的JS问题,但是没有为非HTTPS客户端发明的散列片段魔法?如果hash-fragment无法完全防御恶意攻击,那么简单地在客户端上使用HTTPS并将令牌作为请求参数发送是不是更好? - Baurzhan
不,隐式授权流不适用于非https客户端,它适用于没有后端的客户端。没有将令牌作为请求参数发送的流程。与隐式授权流程相反,授权代码流程提供了 code 作为客户端后端的查询字符串参数。然后,客户端后端使用令牌交换代码(使用客户端凭据进行身份验证的请求) - Andreas Åkre Solberg