我正在使用 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,但这现在对我没有帮助。
在我看来,我有以下选择:
以 JSON 格式发送数据,知道它不会成为 OAuth 签名的一部分,因此会受到中间人攻击。显然不是一个有吸引力的解决方案。
UsersController#update_oauth
创建内部委托给常规操作(例如)的特殊 Rails 操作(例如UsersController#update
)。然后将这些从防伪保护中排除 (protects_from_forgery :only => [:update]
)。这应该可行,并且对于一两个动作来说可能是可以接受的,但显然是一个非常混乱的解决方案。覆盖 Rails CSRF 保护以忽略 OAuth 请求。我没有尝试过,但似乎应该可以更改其中一个钩子(可能是
verify_authenticity_token
过滤器)以认为 OAuth 请求成功。
有没有人遇到过这个?有什么建议吗?还是我可能缺少一些基本的东西?