【问题标题】:OAuth 2.0 state parameter for csrf protection用于 csrf 保护的 OAuth 2.0 状态参数
【发布时间】:2020-12-05 15:10:11
【问题描述】:

我对授权码授予流程有一些疑问。 我知道 oauth2 的第一部分是发送 https://auth.server/oauth2/auth?scope= &redirect_uri=https://app.example.com/oauth2/callback &response_type=code&client_id=123 &state=af0ifjsldkj

我对 state 参数感到困惑。我了解 state 参数是为了防止 csrf 的攻击。但是我应该在哪里保存这个参数?如果我将它保存到身份验证服务器的会话中,我如何在以下步骤中验证状态?

https://app.example.com/oauth2/callback?
code=MsCeLvIaQm6bTrgtp7&state=af0ifjsldkj

如何验证 app.example.com 中的 state 参数,但 state 参数保存在 auth server 的 session 中?

【问题讨论】:

    标签: oauth-2.0 authorization csrf csrf-token


    【解决方案1】:

    您的技术堆栈的安全库应该会为您管理这些,并且状态将保存在您的应用中:

    • 对于单页应用,通常会将状态保存到本地存储
    • 对于服务器端 Web 应用程序,通常使用临时的仅 HTTP cookie 来代替

    身份验证服务器的唯一工作是确保它在对应用的响应中返回与在应用请求中收到的相同状态。任何现成的 Auth Server 都会为您执行此操作。

    steps 4 and 7 of my blog post 中直观地总结了行为。就我而言,我使用的是 SPA,OIDC 客户端库管理验证响应状态。

    因此,我的应用程序受到保护,免受 CSRF 攻击。如果有人将此粘贴到浏览器地址栏中,我的应用将不会尝试处理授权代码:

    【讨论】:

    • 但是正如你提到的 cookie ,但是我们为什么不使用 session 呢?
    • 根据 OAuth 标准,该状态应保存在客户端/用户界面中并在那里进行验证,以防止某种类型的替换攻击。在某些情况下,身份验证服务器确实会在其会话中存储状态,例如用于 PKCE 保护,尽管这可以防止不同的攻击。 OAuth Threat Model 更详细地讨论了这些方面。
    猜你喜欢
    • 2018-10-12
    • 2010-12-22
    • 2020-07-22
    • 2012-07-19
    • 2015-02-07
    • 2023-03-10
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多