2009-12-03 134 views
5

我使用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保護

我看到它的方式,我有以下選擇:

  1. 發送數據作爲JSON,知道它不會是OAuth的簽名的組成部分,因而受人在the-中等攻擊。顯然不是一個有吸引力的解決方案。

  2. 創建內部委託給常規操作的特殊Rails動作(例如UsersController#update_oauth)(例如UsersController#update)。然後從僞造保護中排除這些(protects_from_forgery :only => [:update])。這應該起作用,並且對於一兩個動作可能是可以接受的,但顯然這將是一個非常混亂的解決方案。

  3. 重寫Rails CSRF保護以忽略OAuth請求。我還沒有嘗試過,但似乎應該可以更改其中一個掛鉤(可能是verify_authenticity_token過濾器),以便將OAuth請求視爲成功。

有沒有人碰到過這個?任何建議?或者我可能錯過了一些基本的東西?

回答

5

我會回答我自己的問題。 :)

我將以下方法添加到我們的OAuth控制器擴展。在默認實現上增加的唯一東西是oauth?檢查。這似乎是一個竅門,感覺就像一個非常乾淨的解決方案。

def verify_authenticity_token 
    verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)  
end