好了,現在我會給它一個答案來回答你的問題。
CSRF令牌是「會話相關」,這意味着用戶必須與他正在與之通信的應用程序共享會話。這意味着必須在提交實際表單之前提出請求,這是在提交表單之前顯示錶單的標準HTML表單的情況,因此有足夠空間爲此用戶生成CSRF標記。
讓我們調用服務於UI按鈕App1的應用程序和託管REST服務App2的應用程序。
用戶與App1共享會話並獲取App1提供的UI按鈕。一旦用戶點擊該按鈕,就向App1發出請求,並且App1向App2的REST服務發出請求。
結論:用戶不會與App2共享會話,但您的App1與App2有會話。最後有兩件事:
用戶不容易受到App2上的跨站點僞造攻擊,因爲他在該服務器上沒有會話。因此,如果我在這裏發佈類似<img src="http://app2.com/rest-service/destroy>
的內容,App2不會識別我,因爲我不會與App2共享會話,也不會發生任何事情。
可以實現對REST服務自己的保安措施,公衆將其固定:由主要的API
-
這意味着你可以在REST服務下降的CSRF保護和留在S AFE側只要用戶無法通過AJAX等直接調用
加成
CSRF保護您的網站從不是來自你的出身提交的表單(實際上這適用於已發佈表單只因爲他們通常操縱數據。
最大的情況是:我是攻擊者,我想更新您的用戶帳戶名稱爲「Mr. Potatoe」,我會這樣做的方式是在我的網站上放置隱藏表單,到Yourdomain.com/account
與隱藏字段如account[name]="Mr. Potatoe"
。現在沒有CSRF保護會發生什麼?我的瀏覽器提交表單,併發送認證cookie,我的名字現在是「Mr. Potatoe」。 CSRF保護會發生什麼?我的瀏覽器提交表單併發送cookie,但表單沒有CSRF令牌,因此請求被拒絕。在這種情況下,攻擊者是否有辦法獲得CSRF令牌?答案是不。也許你會問自己....
現在讓我們切入正題:我無法發送從我的頁面隱藏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
注意:這僅僅保護你從跨網站僞造,沒有別的......
是兩個應用程序的後端之間的通信還是有可能爲「前端」用戶直接調用REST功能? – sled 2012-02-04 14:56:00
UI調用一個按鈕操作,這又會導致控制器將此調用發送到REST服務。控制器的 – Sam 2012-02-04 16:22:15
您的意思是應用程序A的軌道控制器嚮應用程序B的控制器發出請求? – sled 2012-02-04 17:40:28