12

首先,我仍然是 MVC4 的初学者,在注意到许多动作都用[ValidateAntiForgeryToken].

谁能用一个最简单的例子来解释这个概念?

4

2 回答 2

18

简而言之,它可以防止外部发布请求。因此,没有人可以从其他站点使用您的方法。

这个怎么运作。你AntiForgeryToken在你Html.BeginForm的视野中。

@using (Html.BeginForm()){

@Html.AntiForgeryToken()

//** fields of form

}

当您提交表单时,您会将数据发送到您的 Controller 方法。如果方法具有ValidateAntiForgeryToken属性,它会验证您发送的数据是否具有您的 ForgeryToken。

[ValidateAntiForgeryToken]
public ViewResult Update()
{
}

ForgeryToken 每个会话生成一次。

于 2013-09-10T15:05:52.003 回答
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 只是一个任意字符串。不同的盐值意味着将生成不同的防伪令牌。这意味着即使攻击者设法以某种方式获取了有效令牌,他们也无法在需要不同盐值的应用程序的其他部分重用它。

令牌是如何生成的?下载源代码,并查看 AntiForgeryDataSerializer、AntiForgeryData 类。这有一个重复。

于 2013-09-10T15:05:34.347 回答