如何防范OAuth身份验证漏洞
翻译
原文:https://portswigger.net/web-security/oauth/preventing
- name: 翻译
desc: 原文:https://portswigger.net/web-security/oauth/preventing
bgColor: '#F0DFB1'
textColor: 'green'
1
2
3
4
2
3
4
# 1如何防范OAuth身份验证漏洞
为了抵御 OAuth 身份验证漏洞 (opens new window),OAuth 提供商和客户端应用程序都必须对关键输入(尤其是redirect_uri
参数)进行可靠的验证。OAuth 规范中的内置保护很少,因此开发人员需要自己确保 OAuth 流程尽可能安全。
值得注意的是,同一漏洞可能同时出现在客户端应用程序和 OAuth 服务本身中。有时,虽然你自己的实现是坚如磐石的,但你最终仍然依赖于 对端应用程序 的健壮性。
# 2对于OAuth服务提供商
- 要求客户端应用程序注册有效的
redirect_uris
白名单。尽可能使用严格的逐字节比较,来验证任何传入请求中的 URI。只允许完全匹配和精确匹配,而不是仅使用模式匹配。这可以防止攻击者访问白名单域上的其他页面。 - 强制使用
state
参数。参数值应该包含一些不可猜测的、特定于会话的数据(例如包含会话 cookie 的哈希值)来绑定到用户的会话。这有助于保护用户免受类似 CSRF 的攻击。这也让攻击者更难利用任何被盗的授权码。 - 在资源服务器上验证
client_id
,确保访问令牌被颁发给了发出请求的同一客户端。你还应检查所请求的作用域,以确保它 与 最初授予令牌时的作用域相匹配。
# 3对于OAuth客户端应用程序
- 在实施 OAuth 之前,请确保你完全了解 OAuth 的工作原理。许多漏洞都是因 不清楚每个阶段发生的事情、以及对这些漏洞缺乏了解而引起的。
- 一定要使用
state
参数,即使它不是必需的。 redirect_uri
参数不要只发送给/authorization
端点,还要发送到/token
端点。- 在开发移动或本机桌面 OAuth 客户端应用程序时,通常无法保持
client_secret
的机密性。在这种场景下,可以使用 PKCE(RFC 7636)机制来提供额外的保护,防止访问代码被拦截或泄露。 - 如果你使用 OpenID (opens new window) Connect 的
id_token
,请根据 “JSON Web Signature”(JWS)签名、JSON Web Encryption(JWE)加密和 OpenID 规范对其进行正确的验证。 - 小心使用授权码 - 在加载外部图像、脚本或 CSS 内容时,授权代码可能会经过
Referer
标头泄露。同样重要的一点,不要将授权代码包含在动态生成的 JavaScript 文件中,因为授权代码中可以注入外部脚本并通过<script>
标签来执行。
编辑 (opens new window)