【问题标题】:Rails, OAuth, and CSRF protectionRails、OAuth 和 CSRF 保护
【发布时间】:2010-12-22 23:30:02
【问题描述】:

我正在使用 REST 和 OAuth 与 Rails 应用程序(来自 iPhone 应用程序,但这不相关)。但是,我在 Rails 的 CSRF 保护方面遇到了一些问题(通过 protects_from_forgery)。

我了解 CSRF 保护仅适用于常规表单提交(即 Content-Type=application/x-www-form-urlencoded),所以如果我提交 JSON 或 XML 数据就可以了。不幸的是,OAuth 目前仅限于 application/x-www-form-urlencoded 请求。有一个 draft spec that extends OAuth to non-form-urlencoded data,但现在这对我没有帮助。

在我看来,我有以下选择:

  1. 以 JSON 格式发送数据,知道它不会成为 OAuth 签名的一部分,因此会受到中间人攻击。显然不是一个有吸引力的解决方案。

  2. 创建内部委托给常规操作(例如UsersController#update)的特殊 Rails 操作(例如UsersController#update_oauth)。然后将这些从伪造保护中排除 (protects_from_forgery :only => [:update])。这应该可行,并且对于一两个操作可能是可接受的,但显然是一个非常混乱的解决方案。

  3. 覆盖 Rails CSRF 保护以忽略 OAuth 请求。我没有尝试过,但似乎应该可以更改其中一个钩子(可能是 verify_authenticity_token 过滤器)以认为 OAuth 请求成功。

以前有人遇到过这种情况吗?有什么建议吗?还是我可能缺少一些基本的东西?

【问题讨论】:

    标签: ruby-on-rails json rest oauth csrf


    【解决方案1】:

    我会回答我自己的问题。 :)

    我在我们的 OAuth 控制器扩展中添加了以下方法。在默认实现之上添加的唯一内容是oauth? 检查。这似乎可以解决问题,并且感觉像是一个非常干净的解决方案。

    def verify_authenticity_token
      verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)      
    end
    

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 2019-11-29
      • 2011-06-27
      • 2019-05-16
      • 2017-05-04
      • 2014-07-31
      • 1970-01-01
      • 2020-12-05
      • 2011-12-22
      相关资源
      最近更新 更多