ValidateAntiForgeryToken目的,解释和示例

时间:2012-11-29 08:51:16

标签: c# asp.net-mvc asp.net-mvc-4

您能否解释ValidateAntiForgeryToken目的,并向我展示MVC 4中ValidateAntiForgeryToken的示例?

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

4 个答案:

答案 0 :(得分:323)

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

请注意,此功能会阻止cross site request forgeries。也就是说,来自其他网站的表单会发布到您的网站,尝试使用经过身份验证的用户凭据提交隐藏的内容。攻击涉及欺骗登录用户提交表单,或者只是在页面加载时以编程方式触发表单。

该功能不会阻止任何其他类型的数据伪造或篡改攻击。

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

答案 1 :(得分:44)

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

答案 2 :(得分:2)

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

它将为您的表单生成类似于以下内容的输入元素: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

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

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

[AutoValidateAntiforgeryToken]属性可用于控制器。该属性与ValidateAntiForgeryToken属性的工作原理相同,不同之处在于它不需要令牌,而这些令牌使用以下HTTP方法发出的请求: GET HEAD OPTIONS TRACE

其他信息: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery

答案 3 :(得分:1)

Microsoft为我们提供了内置功能,出于安全目的,我们在应用程序中使用了这些功能,因此没有人可以入侵我们的网站或入侵某些关键信息。

ValidateAntiForgeryToken的使用

让我们尝试一个简单的例子来理解这个概念。我不想使其变得太复杂,这就是为什么我要使用Visual Studio中已经可用的MVC应用程序模板的原因。我们将逐步进行此操作。开始吧。

  1. 步骤1-使用默认的Internet模板创建两个MVC应用程序,并分别命名为CrossSite_RequestForgery和Attack_Application。

  2. 现在,打开CrossSite_RequestForgery应用程序的Web Config,并使用下面给出的字符串更改连接字符串,然后保存。

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF; Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>

`

  1. 现在,单击工具>> NuGet程序包管理器,然后单击程序包管理器控制台

  2. 现在,在Package Manager控制台中运行下面提到的三个命令来创建数据库。

启用迁移添加迁移的第一个更新数据库

重要说明-我已经使用代码优先方法创建了数据库,因为我想以开发人员的工作方式来举例说明。您也可以手动创建数据库。这是您的选择。

  1. 现在,打开“帐户控制器”。在这里,您将看到类型为post的register方法。在此方法上方,应该有一个可用的[ValidateAntiForgeryToken]属性。评论此属性。现在,右键单击注册,然后单击转到视图。再次,您将找到一个HTML帮手,如@ Html.AntiForgeryToken()。也对此发表评论。运行该应用程序,然后单击注册按钮。该网址将以以下形式打开:

http://localhost:52269/Account/Register

注释-我现在知道所有读者都提出了一个问题,那就是为什么需要对这两个助手进行评论,因为每个人都知道这是用来验证请求的。然后,我只想让大家知道这仅仅是因为我想展示在应用这些助手之后和之前的区别。

  1. 现在,打开第二个应用程序,即Attack_Application。然后,打开“帐户控制器”的“注册”方法。只需使用以下简单的方法更改POST方法即可。

                      报名表格         
                  
    1. @ Html.LabelFor(m => m.UserName)@ Html.TextBoxFor(m => m.UserName)
    2.             
    3. @ Html.LabelFor(m => m.Password)@ Html.PasswordFor(m => m.Password)
    4.             
    5. @ Html.LabelFor(m => m.ConfirmPassword)@ Html.PasswordFor(m => m.ConfirmPassword)
    6.         
      

7。现在,假设您是一名黑客,并且您知道从中可以在CrossSite_RequestForgery应用程序中注册用户的URL。现在,您创建了一个Forgey网站作为Attacker_Application,并将相同的URL放在post方法中。

8。立即运行此应用程序并填写注册字段,然后单击注册。您将看到您已在CrossSite_RequestForgery应用程序中注册。如果您检查CrossSite_RequestForgery应用程序的数据库,则将看到并输入您输入的内容。

  1. 重要-现在,打开CrossSite_RequestForgery应用程序,并在Account Controller中注释掉令牌并注册视图。尝试以相同的过程再次注册。然后,将发生如下错误。

“ /”应用程序中的服务器错误。


所需的防伪cookie“ __ RequestVerificationToken”不存在。

这就是概念所说的。我们在视图中添加的内容,即@ Html.AntiForgeryToken()会在加载时生成__RequestVerificationToken,并在Controller方法中提供[ValidateAntiForgeryToken]。在发布时间匹配此令牌。如果令牌相同,则表示这是有效请求。