ValidateAntiForgeryToken 用途、解释和示例

Posted

技术标签:

【中文标题】ValidateAntiForgeryToken 用途、解释和示例【英文标题】:ValidateAntiForgeryToken purpose, explanation and example 【发布时间】:2012-11-17 07:11:11 【问题描述】:

您能解释一下ValidateAntiForgeryToken 的用途,并给我看有关 MVC 4 中 ValidateAntiForgeryToken 的示例吗?

我找不到任何解释这个属性的例子?

【问题讨论】:

查看这个帖子prideparrot.com/blog/archive/2012/7/… 顺便说一句,我真的不明白为什么 MS 不能把它放在 .BeginForm 助手中。所以这个东西是自动存在的,就像在 Rails 中一样 【参考方案1】:

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

请务必注意,该功能会阻止 cross site request forgeries。也就是说,来自另一个站点的表单发布到您的站点以尝试使用经过身份验证的用户的凭据提交隐藏内容。攻击包括诱骗登录用户提交表单,或者在页面加载时简单地以编程方式触发表单。

该功能无法防止任何其他类型的数据伪造或基于篡改的攻击。

要使用它,请使用ValidateAntiForgeryToken 属性装饰操作方法或控制器,并在发布到该方法的表单中调用@html.AntiForgeryToken()

【讨论】:

@Chris 两者兼而有之。根据我的回答:“将唯一值写入仅限 HTTP 的 cookie,然后 将相同的值写入表单 为什么默认不设置这个? @Christian 因为它不是 Ruby on Rails。 ;-) 貌似__RequestVerificationToken和cookie __RequestVerificationToken的形式不一样,它们是成对的。 @rdans 一点也不,CORS 和 CSRF 完全不同。 CORS 用于允许其他域访问您服务器上的 API,CSRF 用于确保表单帖子来自您期望的页面。【参考方案2】:

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()

【讨论】:

是的,您是对的,您需要从您的表单中调用@Html.AntiForgeryToken() 并将ValidateAntiForgeryTokenAttribute 添加到您要保护的操作方法中。【参考方案3】:

在 ASP.Net Core 中,防伪令牌会自动添加到表单中,因此如果您使用 razor 表单元素或使用 IHtmlHelper.BeginForm 并且表单的方法不是 GET,则无需添加 @Html.AntiForgeryToken() .

它将为您的表单生成类似于此的输入元素:

<input name="__RequestVerificationToken" type="hidden" 
       value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

当用户提交表单时,如果启用验证,则在服务器端验证此令牌。

[ValidateAntiForgeryToken] 属性可用于操作。除非请求包含有效的防伪令牌,否则对应用了此过滤器的操作发出的请求将被阻止。

[AutoValidateAntiforgeryToken] 属性可用于控制器。此属性与 ValidateAntiForgeryToken 属性的工作方式相同,只是它不需要使用以下 HTTP 方法发出的请求的令牌: GET HEAD OPTIONS TRACE

附加信息: docs.microsoft.com/aspnet/core/security/anti-request-forgery

【讨论】:

以上是关于ValidateAntiForgeryToken 用途、解释和示例的主要内容,如果未能解决你的问题,请参考以下文章

如何全局设置 ValidateAntiForgeryToken

Web API 和 ValidateAntiForgeryToken

ValidateAntiforgeryToken 失败

ValidateAntiForgeryToken 400 错误使用角度 13 和 ASP.NET 核心 5

如何正确使用ValidateAntiForgeryToken?

带有 SPA 架构的 ValidateAntiForgeryToken