2013-08-22 83 views
12

我一直在使用REST API開發Rails應用程序,以便從移動應用程序訪問。如何確保從CSRF保護Rails API?

它工作得很好。當用戶從移動應用程序登錄時,他獲得了他在未來對API的請求中使用的auth_token。問題在於,通過轉到path/api/v1/...也可以從web訪問API,因此,它必須受到CSRF的保護。

我有BaseApiController類繼承自ApplicationControllerprotect_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找到。

回答

8

您可能會看到人建議CSRF不是API請求的問題(沒有到開始的狀態,所以還有什麼可無論如何劫持?),所以一些建議以下簡單地消除警告:

skip_before_filter :verify_authenticity_token, :only => [:your_method] 

但是,有人評論說可以使用各種基於Flash和基於Java的方法提交CSRF。我相信,在軌而回用於安全修補程序的原因:http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/

在任何情況下,很好地解決實際檢查的真實性令牌可以在這裏找到:WARNING: Can't verify CSRF token authenticity rails

它涉及到在實際設置請求中的標題。

祝你好運!