如何防御OAuth认证漏洞
防御OAuth认证漏洞,OAuth服务提供者和client对用户输入的校验必不可少,特别是redirect_uri参数。在OAuth规范中几乎没有内置防护,因此,OAuth的安全只能取决于开发人员自己。
需要注意的是,漏洞可能同时出现在client和OAuth服务提供者。即使这一端的实现非常安全,但最终仍然依赖于另一端的应用也同样安全。
1. OAuth服务提供者
- 要求client注册合法的redirect_uri白名单,尽可能使用严格的逐字节比对来验证任何传入请求中的URI。只允许完全和精确的匹配,而不是使用模式匹配。这可以防止攻击者访问白名单域上的其他页面。
- 强制使用state参数。它的值还应该通过包含一些不可猜测的、用于会话的数据(比如包含会话cookie的hash)来绑定到用户的会话。帮助用户防御CSRF类似攻击。它还使攻击者更难使用和窃取授权码。
- 在资源服务器上,确保将access token发送给发出请求的那个client_id。您还应该检查请求的scope,以确保它与最初授予token的scope相匹配。
2. client
- 在实现OAuth之前,确保你完全理解了它的工作原理。许多漏洞都是由于对每个阶段到底发生了什么、以及如何被攻击者利用的,没有深入理解而造成的。
- 即使没有强制要求也使用state参数。
- 不仅要向/authorization端点发送redirect_uri参数,还要向/token端点发送。
- 在开发移动或本机桌面OAuth客户端应用程序时,通常client_secret不可能不公开。在这种情况下,PKCE (RFC7638)机制可用于提供额外的保护,防止access token被截取或泄露。
- 如果您使用OpenID Connect id_token,请确保根据JSON Web签名、JSON Web加密和OpenID规范正确验证它。
- 在加载外部图像、脚本或CSS内容时,授权码可能会通过Referer头泄露。同样重要的是,不要将它们包含在动态生成的JavaScript文件中,因为它们可能通过