我一直在使用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找到。