2012-07-30 35 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