我使用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,但这现在没有帮助我。轨,OAuth的,和CSRF保护
我看到它的方式,我有以下选择:
发送数据作为JSON,知道它不会是OAuth的签名的组成部分,因而受人在the-中等攻击。显然不是一个有吸引力的解决方案。
创建内部委托给常规操作的特殊Rails动作(例如
UsersController#update_oauth
)(例如UsersController#update
)。然后从伪造保护中排除这些(protects_from_forgery :only => [:update]
)。这应该起作用,并且对于一两个动作可能是可以接受的,但显然这将是一个非常混乱的解决方案。重写Rails CSRF保护以忽略OAuth请求。我还没有尝试过,但似乎应该可以更改其中一个挂钩(可能是
verify_authenticity_token
过滤器),以便将OAuth请求视为成功。
有没有人碰到过这个?任何建议?或者我可能错过了一些基本的东西?