5

我正在使用 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 请求。有一个草案规范将 OAuth 扩展到 non-form-urlencoded data,但这现在对我没有帮助。

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

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

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

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

有没有人遇到过这个?有什么建议吗?还是我可能缺少一些基本的东西?

4

1 回答 1

5

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

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

def verify_authenticity_token
  verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)      
end
于 2009-12-03T20:28:28.133 回答