2012-11-29 53 views
239

您能否解释ValidateAntiForgeryToken的用途并在MVC 4中显示关于ValidateAntiForgeryToken的示例?ValidateAntiForgeryToken的用途,说明和示例

我找不到解释此属性的任何示例?

+6

检查这个帖子http://prideparrot.com/blog/archive/2012/7/securing_all_forms_using_antiforgerytoken – VJAI

+1

顺便说一下,我真的不明白为什么MS没有把这个权利放在'.BeginForm'帮手里面。所以这个东西是自动出现的,就像Rails中的 – jazzcat

回答

281

MVC的防伪支持为仅限HTTP的cookie写入唯一值,然后将相同的值写入表单。提交页面时,如果cookie值与表单值不匹配,则会引发错误。

重要的是要注意,该功能可以防止​​3210。也就是说,来自另一个网站的表单发布到您的网站,以尝试使用经过身份验证的用户的凭据提交隐藏的内容。该攻击涉及欺骗登录用户提交表单,或者在页面加载时通过编程方式触发表单。

该功能不会阻止任何其他类型的数据伪造或基于篡改的攻击。

要使用它,请使用ValidateAntiForgeryToken属性修饰操作方法或控制器,并在发送到方法的表单中发送呼叫@Html.AntiForgeryToken()

+0

谢谢你的帮助 –

+1

通过MVC CRUD模板的实现方式判断,这看起来不正确。如果您查看使用它生成的表单,您会在每个表单中看到@ Html.AntiForgeryToken()。 VSDoc为此说它会生成一个带有防伪标记的隐藏表单域。似乎很清楚它实际上是一个隐藏的表单字段,而不是一个cookie。有没有一个单独的场景,它是一个cookie? –

+4

@Chris它是两个。根据我的回答:“写一个唯一的值给一个仅限HTTP的cookie,然后*将相同的值写入表单*” –

36

ValidateAntiForgeryToken属性的基本目的是防止跨站点请求伪造攻击。

跨站请求伪造是攻击者从受信任用户的浏览器发送有害脚本元素或恶意命令或代码的攻击。有关跨站点请求伪造的更多信息,请访问 http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages

它使用简单,你需要装饰的方法与ValidateAntiForgeryToken属性如下:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult CreateProduct(Product product) 
{ 
    if (ModelState.IsValid) 
    { 
    //your logic 
    } 
    return View(ModelName); 
} 

它是由System.web.mvc命名空间

而在你的视图派生,添加以下代码添加的令牌,因此它被用来在提交给验证表单

@Html.AntiForgeryToken() 
+0

是的,您需要从表单中调用@ Html.AntiForgeryToken(),并将ValidateAntiForgeryTokenAttribute添加到您要保护的操作方法中。 –