首先,我仍然是MVC4的首发,在注意到许多动作都被[ValidateAntiForgeryToken]
修饰后,我用Google搜索,但仍然有些混乱。
有人能用最简单的例子解释这个概念吗?
答案 0 :(得分:17)
简单来说,它可以防止外部帖子请求。因此,没有人可以使用其他网站的方法。
工作原理。您在AntiForgeryToken
视图中看到了Html.BeginForm
。
@using (Html.BeginForm()){
@Html.AntiForgeryToken()
//** fields of form
}
提交表单时,会将数据发送到Controller方法。如果方法具有ValidateAntiForgeryToken
属性,则会验证您发送的数据是否具有ForgeryToken。
[ValidateAntiForgeryToken]
public ViewResult Update()
{
}
每次会话都会生成一次ForgeryToken。
答案 1 :(得分:6)
这里有很多关于AntiForgeryToken的信息:http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/
这是为了防止跨站请求伪造(CSRF)。单击“保存”对表单进行汇总并在服务器上执行某些操作(即保存用户的详细信息)是非常标准的行为。您如何知道提交表单的用户是他们声称的用户?在大多数情况下,您会使用一些cookie或基于Windows的身份验证。
如果攻击者将您引诱到一个在隐藏的IFRAME中提交完全相同形式的网站,该怎么办?您的cookie完整提交,服务器看不到请求与合法请求有任何不同。 (正如gmail发现的那样:http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/)
防伪令牌通过在每次生成页面时创建额外的Cookie令牌来防止这种形式的攻击。令牌都在表单和cookie中,如果表单和cookie不匹配,我们会有CSRF攻击(因为攻击者无法使用上述攻击读取防伪令牌)。
从上面的文章中盐的作用是什么:
Salt只是一个任意字符串。不同的盐值意味着将生成不同的防伪标记。这意味着即使攻击者设法以某种方式获得有效令牌,他们也无法在需要不同盐值的应用程序的其他部分重用它。
如何生成令牌?下载source,看一下AntiForgeryDataSerializer,AntiForgeryData类。This has a duplicate.