2012-02-04 46 views
11

我們的rails3應用程序與另一個作​​爲REST函數公開的rails應用程序通信。在對REST服務進行的所有POST調用中,我們將以下警告過渡到rails3。如何在rails應用程序之間傳遞CSRF令牌

WARNING: Can't verify CSRF token authenticity 

我們應該如何通過電線上的CSRF令牌,當我們做一個POST調用REST服務,在ApplicationController中有protect_from_forgery方法和調用也登陸上handle_unverified_request通話。我們使用HTTP基本身份驗證進行身份驗證,它似乎工作正常。我們應該怎樣做才能解決這個問題。

+0

是兩個應用程序的後端之間的通信還是有可能爲「前端」用戶直接調用REST功能? – sled 2012-02-04 14:56:00

+0

UI調用一個按鈕操作,這又會導致控制器將此調用發送到REST服務。控制器的 – Sam 2012-02-04 16:22:15

+0

您的意思是應用程序A的軌道控制器嚮應用程序B的控制器發出請求? – sled 2012-02-04 17:40:28

回答

9

好了,現在我會給它一個答案來回答你的問題。

CSRF令牌是「會話相關」,這意味着用戶必須與他正在與之通信的應用程序共享會話。這意味着必須在提交實際表單之前提出請求,這是在提交表單之前顯示錶單的標準HTML表單的情況,因此有足夠空間爲此用戶生成CSRF標記。

讓我們調用服務於UI按鈕App1的應用程序和託管REST服務App2的應用程序。

用戶與App1共享會話並獲取App1提供的UI按鈕。一旦用戶點擊該按鈕,就向App1發出請求,並且App1向App2的REST服務發出請求。

結論:用戶不會與App2共享會話,但您的App1與App2有會話。最後有兩件事:

  1. 用戶不容易受到App2上的跨站點僞造攻擊,因爲他在該服務器上沒有會話。因此,如果我在這裏發佈類似<img src="http://app2.com/rest-service/destroy>的內容,App2不會識別我,因爲我不會與App2共享會話,也不會發生任何事情。

  2. 可以實現對REST服務自己的保安措施,公衆將其固定:由主要的API

    • 認證通過HTTP基本認證
    • 認證....

這意味着你可以在REST服務下降的CSRF保護和留在S AFE側只要用戶無法通過AJAX等直接調用

加成

CSRF保護您的網站從不是來自你的出身提交的表單(實際上這適用於已發佈表單只因爲他們通常操縱數據。

最大的情況是:我是攻擊者,我想更新您的用戶帳戶名稱爲「Mr. Potatoe」,我會這樣做的方式是在我的網站上放置隱藏表單,到Yourdomain.com/account與隱藏字段如account[name]="Mr. Potatoe"。現在沒有CSRF保護會發生什麼?我的瀏覽器提交表單,併發送認證cookie,我的名字現在是「Mr. Potatoe」。 CSRF保護會發生什麼?我的瀏覽器提交表單併發送cookie,但表單沒有CSRF令牌,因此請求被拒絕。在這種情況下,攻擊者是否有辦法獲得CSRF令牌?答案是不。也許你會問自己....

  • 如果我把什麼我的網站上隱藏的iframe指向Yourdomain.com/account/edit,只是複製包含令牌的隱藏字段? - 回答:由於相同的原產地政策,它不起作用,如果其內容不是來自您的域,則無法讀取iframe中的內容。

  • 如果我在後臺進行AJAX調用以獲取令牌,該怎麼辦?答:這不會起作用,因爲使用純粹的AJAX,您也必須遵守相同的原產地政策。

現在讓我們切入正題:我無法發送從我的頁面隱藏AJAX調用你的傷害你的用戶是誰在我的網站。

這是什麼意思?您可以實現一個before過濾器,用於檢查request.xhr?是否爲true或用戶代理是否類似「我的REST客戶端XY」,因爲這不能由>>瀏覽器< <中的跨站請求僞造。所以如果是這種情況,你可以忽略/禁用CSRF保護。

通過,如果你想使你的網站內的AJAX請求就可以獲得CSRF方式令牌是這樣的:

var token = $('meta[name="csrf-token"]').attr('content'); 

見的Rails UJS腳本:https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L81

注意:這僅僅保護你從跨網站僞造,沒有別的......

+0

有用。但是如果REST服務既可以作爲REST服務又可以作爲HTML頁面調用呢?假設您正在使用ruby編寫針對Rails應用程序的測試,並希望能夠測試發佈表單,但是上面提到的CRSF失敗正在發生。好像我們必須獲得一個會話並獲得CSRF令牌以回傳帖子。但是如何? – Dad 2012-04-06 04:15:30

+0

對於測試用例來說,看起來像這樣的東西可能會很有用:https://github.com/archiloque/rest-client,因爲它讓我們得到應該包含CSRF標記的cookie。 (???) – Dad 2012-04-06 04:19:46

+0

Afaik將csrf標記作爲隱藏字段嵌入到表單標記中,並將definitley作爲標記嵌入部分中。 – sled 2012-04-07 20:16:57

相關問題