首先,我仍然是 MVC4 的初学者,在注意到许多动作都用[ValidateAntiForgeryToken]
.
谁能用一个最简单的例子来解释这个概念?
首先,我仍然是 MVC4 的初学者,在注意到许多动作都用[ValidateAntiForgeryToken]
.
谁能用一个最简单的例子来解释这个概念?
简而言之,它可以防止外部发布请求。因此,没有人可以从其他站点使用您的方法。
这个怎么运作。你AntiForgeryToken
在你Html.BeginForm
的视野中。
@using (Html.BeginForm()){
@Html.AntiForgeryToken()
//** fields of form
}
当您提交表单时,您会将数据发送到您的 Controller 方法。如果方法具有ValidateAntiForgeryToken
属性,它会验证您发送的数据是否具有您的 ForgeryToken。
[ValidateAntiForgeryToken]
public ViewResult Update()
{
}
ForgeryToken 每个会话生成一次。
这里有很多关于 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 类。这有一个重复。