Rails、OAuth 和 CSRF 保护

发布于 2024-08-13 13:47:17 字数 1006 浏览 7 评论 0原文

我正在使用 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 扩展到非form-urlencoded data,但这现在对我没有帮助。

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

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

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

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

以前有人遇到过这个吗?有什么建议吗?或者我可能错过了一些基本的东西?

I am using REST and OAuth to talk to a Rails app (from an iPhone app, but that should not be relevant). However, I am running into some issues with Rails' CSRF protection (via protects_from_forgery).

I understand that CSRF protection only kicks in for regular form submissions (i.e. Content-Type=application/x-www-form-urlencoded), so I would be fine if I was submitting JSON or XML data. Unfortunately, OAuth is currently limited to application/x-www-form-urlencoded requests. There's a draft spec that extends OAuth to non-form-urlencoded data, but this doesn't help me right now.

The way I see it, I have the following options:

  1. Send the data as JSON, knowing that it would not be part of the OAuth signature and thus subject to man-in-the-middle attacks. Obviously not an attractive solution.

  2. Create special Rails actions (e.g. UsersController#update_oauth) that internally delegate to the regular actions (e.g. UsersController#update). Then exclude these from the forgery protection (protects_from_forgery :only => [:update]). This should work and might be borderline acceptable for one or two actions, but obviously would be a very messy solution.

  3. Override the Rails CSRF protection to ignore OAuth requests. I have not tried this, but it seems like it should be possible to change one of the hooks (perhaps the verify_authenticity_token filter) to consider OAuth requests successful.

Has anybody run into this before? Any recommendations? Or am I perhaps missing something basic?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤独岁月 2024-08-20 13:47:17

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

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

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

I'll answer my own question. :)

I added the following method to our OAuth controller extensions. The only thing this adds on top of the default implementation is the oauth? check. This seems to do the trick and feels like a pretty clean solution.

def verify_authenticity_token
  verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)      
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文