2009-02-16 103 views
5

我知道如何使用MVC的AntiForgeryToken屬性及其關聯的HTML幫助器來幫助XSRF保護我的應用程序的表單POST。如何保護我的JsonResult GET調用?

對於實現GET的JsonResults可以做些類似的事情嗎?

例如,我的觀點中包含的onsubmit jQuery的調用像這樣:

$.getJSON("/allowActivity/YesOrNo/" + someFormValue, "{}", function(data) { 
    if(data.Allow) { 
    //Do something. 
    } 
}); 

我希望確定這JsonResult是預期頁只調用。

編輯:

我發現this post有關類似的問題,沒有具體的答案。

確保我的GET(非破壞性)URL只被來自我自己的頁面的AJAX調用消耗的最簡單方法是什麼?

回答

8

您可以將AntiForgeryToken與某些自定義邏輯結合使用。在服務器上創建AntiForgery標記是相同的,但默認情況下,該值不包含在您的XmlHttpRequest中。

此令牌的值位於HTTP唯一Cookie「__RequestVerificationToken」中,並且也應以發佈到服務器的表單數據形式存在。因此,在您的XmlHttpRequest一個鍵/值對,並使用ValidateAntiForgeryToken - 屬性控制器上

編輯:

今天我使用AntiForgeryToken阿賈克斯試圖要求自己和它的正常工作。只需使用下面的JavaScript:

$.post('my_url', $.getAntiForgeryTokenString(), function() { ... }); 

$.getAntiForgeryTokenString = function() { 
    return $(document.getElementsByName("__RequestVerificationToken")).fieldSerialize(); 
}; 

在你沒有改變你的代碼在服務器端 - 只使用ValidateAntiForgeryToken-屬性爲您的操作。

希望這有助於

+0

你將如何整合與$ .getJSON或$就調用__RequestVerificationToken價值?請記住,這是一個GET請求。 – 2009-02-16 22:58:21

+0

讀自http://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet「在URL令牌披露」 「如果敏感的服務器端操作,保證只響應POST請求,然後沒有必要在GET請求中包含令牌「關鍵是確保GET不會修改數據。否則,你不需要保護GET請求 – 2010-03-22 21:12:15

0

你可以做類似反XSRF方法。只需生成一些ID將其插入到JavaScript中,當用戶調用您的JSON url時,請將該URL包含生成的ID並檢查它是否存在。

針對XSRF的防禦也使用sessionID作爲關鍵,但這並不能阻止用戶從另一個網站爲自己的帳戶執行它。

基於會話和時間的一些散列可能會訣竅。當然,如果用戶從JS複製值,他仍然可以從另一個位置執行它,但是你可以讓該值每x分鐘過期一次。另一個選擇是用JS設置一個cookie並在服務器端讀取它。

希望這給你一些想法,讓你開始。

1

首先,爲什麼不使用.post的$(網址,數據,回調, 'JSON')代替的getJSON? 正如kleolb02說,你可以使用cookie plugin cookie來後數據增加值 - {__RequestVerificationToken:$ .cookie(「__ RequestVerificationToken」)}

1

我已經在ASP.NET MVC項目中使用類似的代碼使用在沒有Ajax形式的元素的模糊函數上。此代碼用於在發生特定HTML元素模糊事件時向服務器數據填充文本字段。

希望這也有幫助。這裏是我的代碼:

的Javascript:

var mytext = { 'myText': 'example text' }; 
$.post('/MyController/JsonResultMethod', AddAntiForgeryToken(myText), function (resultData) { 
     $('#htmlElement').val(resultData); 
}); 
AddAntiForgeryToken = function (data) { 
    data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val(); 
    return data; 
}; 

C-夏普代碼:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public JsonResult SeoString(string myText) 
    { 
     try 
     { 
      // do something here 
      return this.Json("result text"); 
     } 
     catch (Exception) 
     { return this.Json(string.Empty); } 
    }