当前位置: 首页 > 面试题库 >

基于散列片段的安全性到底如何工作?

牛枫
2023-03-14
问题内容

我正在学习OAuth 2.0,无法获得 隐式授权流程
中保护访问令牌的方法。规范中有一些论点,有些被推崇的SO答案看起来彼此矛盾。有人可以解决吗?SO答案和规范引述让我感到困惑:

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

我的问题:

P1说通过重定向URI传递给客户端的令牌,P2说传递通道必须是TLS版本的。但是P3表示 哈希片段没有发送到网络
。如果访问令牌由于其哈希片段而未发送,则如何到达客户端?无论如何,它必须通过网络发送,不是吗?还是发送带有重定向URI的令牌会使网络交易变得有些神奇?

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


问题答案:

OAuth Provider通过HTTP响应重定向将访问令牌发送回OAuth使用者:

HTTP/1.1 302 Found
Location: https://consumer.org/redirect_uri#access_token=1111-2222-3333-4444

请注意,作为来自OAuth Provider的HTTP响应的一部分,访问令牌是如何通过网络发送的,除使用方外,ALSO还应位于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>


 类似资料:
  • 我正在学习OAuth2.0,无法获得在隐式授权流中保护访问令牌的方法。在规范中有一些论题,有些被推翻,所以答案看起来相互矛盾。有人能把它清理一下吗?引自SO的答案和说明,让我困惑: (来自规范)用于将访问令牌传递给客户端的重定向URI。访问令牌可以公开给资源所有者或具有访问资源所有者用户代理权限的其他应用程序。 (来自spec)访问令牌凭据(以及任何机密的访问令牌属性)在传输和存储过程中必须保密,

  • 我想在Spring Boot项目中添加基于方法的安全性。 看来我需要的只是添加和bean,用注释我的和用方法。 HelloController.java hellopermissionevaluator.java WebSecurityConfig.java

  • 我试图完全理解密码散列,以便能够向审计员解释它。 基于我对答案的搜索,我知道函数是的包装器。在阅读预定义常量的PHP手册时,我看到它使用作为默认整数值(基本上它使用算法来散列密码)。 让我困惑的是,变量如果省略,会生成一个随机salt,并且成本将设置为。如果我提供了更高的成本(例如:),由于我没有提供salt值,它还会生成随机salt吗?我在这里感到困惑的原因是,我没有忽略,而是提供了不同的成本。

  • 如何从注释中提取操作和对象参数? 如何解析对象定义中的SpEL表达式并将对象作为'act'参数传递?

  • 问题内容: 我想在Spring Boot项目中添加基于方法的安全性。 似乎我只需要添加和bean,用和注释方法。 但是加入豆子之后 我得到一个消息:“配置默认的servlet处理需要ServletContext”: 我在网上可以找到的所有内容都与jUnit测试有关。为什么会引发此异常?我想念什么?我是否必须添加一个ServletContext bean,如果需要,如何添加? 我的要求是Gradle

  • 每当我将以下内容复制并粘贴到web浏览器中时 原始URL http://accounts.spotify.com/authorize?client _ id = xxx2d 0 ff 4186 b 517 da a4 E1 c 577 e 4 我得到这个最终的网址 最终网址 http://localhost:5000/#access_token=XXX-LQY7xCQXTqpmsfroChl5ye