OAuth2 中范围的好处是什么?

信息安全 Web应用程序 验证 oauth
2021-08-12 20:49:11

在问题中,替换scopestate由于有一个基于错误问题的答案,我将让下面的所有内容保持原样。答案还是有用的。


这个问题是指当前的 OAuth2 草案 v30GitHub 的实现。

GitHub 的“Web 应用程序流程”或多或少是规范中描述的授权代码授予的实现。客户端(Web 应用程序)将用户引导至 GitHub 上的一个特殊页面,该页面询问用户是否希望允许应用程序访问他或她的资源。如果这得到确认,用户将被重定向回客户端,然后使用临时代码检索 OAuth 令牌以供将来使用。

如果客户端scope为用户对 GitHub 的请求提供了参数,则重定向也包含该参数。如果范围是一些只有客户端知道的秘密,客户端可以确定没有其他人创建了该请求,即,用户没有成为 CSRF 攻击的受害者。

但这真的有必要吗?

如果我们选择使用scope参数并且用户确实是 CSRF 攻击的受害者,他或她仍然必须接受 GitHub 提出的是否允许客户端访问用户信息的问题。这一步不能跳过。确实,规范说

[The] 授权服务器对资源所有者进行身份验证并获得授权决定(通过询问资源所有者或通过其他方式建立批准)。

如果攻击者使用点击劫持等其他技术来诱骗用户接受请求,我认为无论如何,所有的赌注都没有,而且范围也不会保护用户。

结论:示波器实际上保护用户免受什么威胁?

2个回答

状态参数

范围参数不用于保护身份验证请求免受 CSRF 攻击(见下文)。但是还有另一个参数称为“状态”,它与您的描述相匹配。

[询问用户]

这一步不能跳过。

恐怕,这个假设是不正确的。很常见的是,当用户第一次使用客户端应用程序时,他只会被要求获得许可。之后,服务器会记住客户端应用程序并自动授予访问权限。

确实,规范说

[The] 授权服务器对资源所有者进行身份验证并获得授权决定(通过询问资源所有者或通过其他方式建立批准)。

其他方式可能包括应用程序受服务器信任(例如,由同一公司拥有)或用户的决定被保存。

因此,在没有状态参数的情况下,攻击者可以欺骗用户登录应用程序,该应用程序原则上为用户所知或服务器普遍信任。

范围参数

scope 参数用于指示客户端请求的权限列表:

授权和令牌端点允许客户端使用“范围”请求参数指定访问请求的范围。

例如,社交网络的权限可能包括:

post_to_my_wall  send_notification  post_to_my_friends_wall  read_my_age

范围参数的值表示为空格分隔、区分大小写的字符串列表。字符串由授权服务器定义。

服务器可能会提供所有请求的权限或修改后的列表(例如,因为用户拒绝了某些权限):

如果颁发的访问令牌范围与客户端请求的范围不同,授权服务器必须包含“范围”响应参数以通知客户端实际授予的范围。

来源:https ://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-30#section-3.3

(答案是基于 OP 的意思是谈论“状态”而不是“范围”的假设)

我不认为“状态”参数是一种安全功能。它只是一个参数,消费者可以使用它来放置一些它想要在授权流程完成后检索的数据。

这在消费者无法自行维护状态(无状态客户端,非基于会话等)的情况下很有用。由于授权流程涉及将用户浏览器重定向到提供程序,因此客户端可能会忘记用户在触发身份验证流程时所在的页面(或用户尝试执行的操作)。

通过在状态参数中传递该信息,客户端将在自动化流程之后将其取回,并可以将用户重定向到例如适当的位置。