2012-07-30 21 views
4

我正在將安全應用於我的.net 3.5 mvc2 web應用程序。 我的網站不包含任何用戶的認證和包括在.js文件AntiForgeryToken如何工作?

在我的.aspx文件我寫

<%= Html.AntiForgeryToken() %> 

在我的js文件的功能,我寫

$(document).ready(function() { 

var token = $('input[name=__RequestVerificationToken]').val(); 

    $.ajax({ 
    url: "/Home/getCurrentLanguage/" + Math.random(), 
     cache: false, 
     type: "POST", 
     async: false, 
     data: {"__RequestVerificationToken":token}, 
     success: function(data) { 
      if (data == "mr") { 
       alert("its Marathi"); 
      } else { 
       alert("its English huh !!!"); 
      } 
      return false; 
     }, 
     error: function(data) { 
      alert("some Error" + data); 
     } 
    }); 

}); 
很多Ajax調用

在我的控制器,我寫

[AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] 
    public JsonResult getCurrentLanguage(string id) 
    { 
     return new JsonResult 
     { 
      Data = "mr" 
     }; 

    } 

這工作對我很好, 但我有2個問題
Q1。這是正確的方法嗎? 如果我看到頁面的源代碼,我發現這個代碼

<input name="__RequestVerificationToken" type="hidden" value="WFd+q5Mz0K4RHP7zrz+gsloXpr8ju8taxPJmrLO7kbPVYST9zzJZenNHBZqgamPE1KESEj5R0PbNA2c64o83Ao8w8z5JzwCo3zJKOKEQQHg8qSzClLdbkSIkAbfCF5R6BnT8gA==" /> 

但是當我創建的外部html文件並複製__RequestVerificationToken的這個值,並通過在Ajax調用,我收到此錯誤
一個必需的抗 - 僞造令牌未提供或無效。 then
Q2。運行時如何知道這個頁面提供複製的__RequestVerificationToken?

回答

2

此「AntiForgeryToken」已準備好阻止Cross-Site Request Forgery攻擊。如果您的應用程序遭受跨站點腳本漏洞,攻擊者可能會破壞該系統。

此令牌可防止CSRF攻擊,因爲由於same-origin policy攻擊者可以發送請求,但他無法從頁面讀取令牌以使請求成功(除非他有xss漏洞)。

對於Q2,此值必須是每個用戶唯一的,因此每次頁面加載時都會更新。如果它只是一個靜態值,那麼它在停止CSRF時就沒用了,因爲攻擊者會知道這個靜態值。

+0

我得到了問題2的答案,因爲瀏覽器的cookie也維護__RequestVerificationToken,所以儘管我從網頁中複製__RequestVerificationToken異常genreated。前2個部分+1,謝謝。期待Q1的回答,我的方法是否正確?或者我必須做更多的事情。 – 2012-08-01 05:19:38

+0

@ d。西瓦。如果該值是動態的(嘗試訪問不同瀏覽器中的頁面)並正確檢查,那麼是的,它應該工作。 – rook 2012-08-01 17:02:14

+0

我在Chrome中進行了測試,即Firefox和它的工作,我認爲這種方法是正確的。我接受了這個答案。 – 2012-08-02 04:49:06