我一直在使用REST API开发Rails应用程序,以便从移动应用程序访问。如何确保从CSRF保护Rails API?
它工作得很好。当用户从移动应用程序登录时,他获得了他在未来对API的请求中使用的auth_token
。问题在于,通过转到path/api/v1/...也可以从web访问API,因此,它必须受到CSRF的保护。
我有BaseApiController
类继承自ApplicationController
有protect_from_forgery
“启用”。这里的例子:
class Api::V1::BaseApiController < ApplicationController
# ...
end
class ApplicationController < ActionController::Base
protect_from_forgery
# ...
end
现在,当我做非GET请求我的API,与auth_token
,我的请求被成功完成,但在日志中我可以看到著名的WARNING: Can't verify CSRF token authenticity
。如果我从BaseApiController
中删除protect_from_forgery
,我没有收到任何警告(很明显),但是我的API容易受到CSRF攻击(我做了一个简单的HTML表单,在没有protect_from_forgery
的情况下成功更改跨域的数据)。
我的问题是:如何确保我的API保持安全,还可以在执行非GET请求时删除警告?
下面是我想出的解决方案之一,但它看起来更像是一个黑客,执行一个额外的数据库查询:
class Api::V1::BaseApiController < ApplicationController
# ...
def verified_request?
super || User.where(authentication_token: params['auth_token']).count > 0
end
end
更多关于项目的详细信息:Rails的3.2.14,设计, AngularJS。该项目的源代码可以在here找到。