有人可以告诉我更多关于它的细节吗?
答案 0 :(得分:14)
基本上,防伪令牌会阻止任何人向您的网站提交由非实际用户生成的恶意脚本生成的请求。有一个仅HTTP的cookie(不是由浏览器中运行的脚本读取,但是由浏览器发送并且可由服务器访问)被发送到客户端,它用于生成隐藏的字段值,然后根据该值进行验证。曲奇饼。至少我认为这是一个过程。
这里有一个很好的描述,这正是你所要求的 https://blogs.msmvps.com/luisabreu/blog/2009/02/09/the-mvc-platform-the-new-anti-forgery-token/
答案 1 :(得分:6)
使用AntiForgeryToken
有助于缓解cross-site request forgery攻击。
当您使用它时,您的表单将包含一个隐藏字段,并且还将在浏览器中设置相应的cookie。
然后,在提交表单时,将根据cookie值检查隐藏字段(假设使用了ValidateAntiForgeryTokenAttribute
):如果字段和cookie匹配,则表单帖子可能是正版;如果他们不这样做那么可能不是。 (尝试CSRF攻击的攻击者可能会伪造隐藏字段,但他们也不能伪造相应的cookie值。)
答案 2 :(得分:3)
今天,我们将在Web应用程序中查看一种称为跨站点请求伪造或CSRF黑客攻击的安全漏洞。 CSRF是XSS中鲜为人知的堂兄.Cross Site Request伪造是一种黑客攻击,黑客利用网站对用户的信任。
执行此操作的简单方法是在ProductDetails post action方法中使用ValidateAnitForgery标记属性,如下所示
[HttpPost]
[Authorize(Roles = "Admins")]
[ValidateAntiForgeryToken()]
public ActionResult Edit(ProductDetails productdetails)
{
if (ModelState.IsValid)
{
db.Entry(productdetails).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(productdetails);
}
要在客户端生成AntiForgeryToken和Cookie,我们在Edit.cshtml中的HTML表单中声明如下
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
@Html.AntiForgeryToken()
<fieldset>
<legend>ProductDetails</legend>
...
这可确保发布到服务器的表单实际上是由同一服务器生成的。因此,没有来自正确服务器的AntiForgeryToken的假表单将被拒绝。
另请参阅此处的简单示例
答案 3 :(得分:1)
通常,反伪造令牌是HTML隐藏的输入,为您提供,以避免CSRF攻击。从广义上讲,它的工作原理是将服务器发送给客户端的值与客户端在帖子上发回的值进行比较。这就是你要找的全部吗?
您应该查看MSDN以获取更多详细信息。
答案 4 :(得分:0)
有关更多信息,我认为这段简短的手稿可以帮助您:
客户端请求一个包含表单的HTML页面。服务器在响应中包含两个令牌。一个令牌作为cookie发送。另一个放置在隐藏的表单字段中。令牌是随机生成的,因此对手无法猜测这些值。客户提交表单,它必须将两个令牌都发送回服务器。客户端将cookie令牌作为cookie发送,并在表单数据内发送表单令牌。 (当用户提交表单时,浏览器客户端会自动执行此操作。)一个请求不同时包含两个令牌,服务器不允许该请求。