2011-02-06 77 views
16

In regards to this Haacked blog,我很猶豫,因爲在HTTP GET使用MVC3的AntiForgeryToken避免使用Javascript CSRF漏洞

  1. 推薦的解決方案,以實現所提出的反JSON GET劫持的解決方案,以減輕JSON劫持涉及非REST-充分JSON POST到GET數據

  2. 備用溶液(對象包裹)導致與第三方控制I不必源代碼訪問問題。

  3. 我找不到社區審查的實施方案,該方案實施了替代解決方案(如下所示),以瞭解如何編寫安全令牌或在網頁中安全傳遞安全令牌。我也不會聲稱是足夠的專家來推出我自己的實施。

  4. 來源標題不能在

背景

This blog介紹了有關JSON劫持CSRF問題的依據,並建議使用JSON的POST獲取數據。由於使用HTTP POST獲取數據不是很REST類型的,我會尋找一個更REST類型的解決方案,使每個會話,或每頁REST動作。

另一個減輕技術是在對象as described here包裝JSON數據。恐怕這可能會延遲這個問題,直到找到另一種技術。

替代實施

對我來說,他很自然地延長使用ASP.NET MVC's AntiForgeryToken使用jQuery HTTP獲取我的JSON。

例如,如果我得到一些敏感的數據,根據上述Haacked鏈路,下面的代碼是脆弱:

$.getJSON('[url]', { [parameters] }, function(json) { 
    // callback function code 
}); 

我同意它不向REST類型GET使用推薦的解決方法POST數據。我的想法是在URL中發送驗證令牌。這樣CSRF風格的攻擊者就不會知道完整的URL。緩存或不緩存,他們將無法獲取數據。

下面是如何完成JSON GET查詢的兩個示例。我不確定什麼實現最有效,但可能會猜測第一個實現是從錯誤的代理緩存這些數據更安全的,因此容易受到攻擊者的攻擊。

http://localhost:54607/Home/AdminBalances/ENCODEDTOKEN-TOKEN-HERE

http://localhost:54607/Home/AdminBalances?ENCODEDTOKEN-TOKEN-HERE

...這很可能會成爲MVC3的AntiForgeryToken,或變體(see swt)上。此令牌將被設置爲任何URL格式上面所選上內嵌值。阻止我從我自己的滾動解決方案

樣題

  1. 什麼URL格式(上圖),你會用它來驗證JSON GET(斜槓,問號等)將代理到http://localhost:54607/Home/AdminBalances迴應有http://localhost:54607/Home/AdminBalances?ENCODEDTOKEN-TOKEN-HERE的數據?

  2. 如何將該編碼的標記傳遞到網頁?內聯,或作爲頁面變量?

  3. 你會如何撰寫該令牌?建在AntiforgeryToken,或通過其他方式?

  4. AntiForgeryToken使用cookie。在這種情況下會使用/需要支持cookie嗎?僅限HTTP? SSL與HTTP Only結合如何?

  5. 你會如何設置你的緩存頭?任何特殊的谷歌網絡加速器(例如)

  6. 只是使JSON請求SSL的含義是什麼?

  7. 爲了安全起見,返回的JSON數組是否應該被包裝在一個對象中?

  8. 這將如何互操作的解決方案與微軟的提議templating and databinding功能

的問題,以上是我不往前衝,這樣做我自己的原因。更不用說可能有更多的問題我沒有想到,但是卻是一種風險。

+0

這只是CSRF的變體。 – SLaks 2011-02-06 17:52:26

回答

13

的Asp.net MVC AntiForgeryToken將無法通過HTTP GET工作,因爲它依賴於依賴於HTTP POST(它使用在OWASP XSRF Prevention Cheat Sheet描述的「Double Submit Cookies」技術)餅乾。您還可以通過設置爲httponly來保護髮送給客戶端的Cookie,因此它們不能通過腳本進行欺騙。

this document中,您可以找到可用於防止XSRF的各種技術。看起來您所描述的將落入方法1.但是,在使用Ajax HTTP GET請求時,如何檢索服務器上的會話時存在問題,因爲Cookie未隨請求一起發送。因此,您還必須爲您的操作URL添加一個會話標識符(又名無cookie會話,這更易於劫持)。所以爲了執行攻擊,攻擊者只需要知道正確的URL來執行GET請求。

也許一個好的解決方案是使用用戶SSL證書中的某個密鑰(例如證書縮略圖)存儲會話數據。這樣,只有SSL證書的所有者才能訪問他的會話。這樣您就不需要使用cookie,也不需要通過查詢字符串參數發送會話標識符。

無論如何,如果您不想在Asp.net MVC中使用HTTP POST,您將需要推出自己的XSRF保護。

+0

我想我將依靠您發佈的鏈接中的OWASP CSRF警衛。謝謝。 http://www.owasp.org/index.php/.Net_CSRF_Guard – LamonteCristo 2011-02-10 18:44:23

3

我來到這個問題,解決方案並不那麼微不足道,但有一個夢幻般的博客讓你開始這可以用於獲取和發佈ajax。

http://johan.driessen.se/posts/Updated-Anti-XSRF-Validation-for-ASP.NET-MVC-4-RC

如果放在全局命名空間中的所有您的文章以下/獲取可以利用一種具有防僞造令牌和你不必修改你的Ajax調用。在通用頁面中創建一個輸入元素。

<form id="__AjaxAntiForgeryForm" action="#" method="post">@Html.AntiForgeryToken()</form> 

以下JavaScript會讀取防僞造tokken並將其添加到請求標頭。

// Wire up the global jQuery ajaxSend event handler. 
$(document).ajaxSend(namespace.ajax.globalSendHandler); 

// <summary> 
// Global handler for all ajax send events. 
// </summary> 
namespace.ajax.globalSendHandler = function (event, xhr, ajaxOptions) { 
    // Add the anti forgery token 
    xhr.setRequestHeader('__RequestVerificationToken', $("#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]").val()); 
};