ValidateAntiForgeryToken的用途,解释和示例


310

您能否解释ValidateAntiForgeryToken的用途,并向我展示有关ValidateAntiForgeryTokenMVC 4的示例?

我找不到任何说明此属性的示例?



1
顺便说一句,我真的不明白为什么MS未能将其正确地放入.BeginForm助手中。所以这东西会自动出现,就像在Rails中一样
-jazzcat

Answers:


350

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

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

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

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


5
@克里斯都是。按照我的回答:“将唯一的值写入仅HTTP的cookie,然后将相同的值写入表单
Richard Szalay

21
为什么默认不设置此设置?
克里斯蒂安·哈格利德

12
@Christian,因为它不是Ruby on Rails。;-)
Martin Capodici 2014年

6
似乎__RequestVerificationToken和cookie __RequestVerificationToken的形式不同,它们可以成对使用。
WaiKit Kung 2015年

5
@rdans完全没有,CORS和CSRF完全不同。CORS用于允许其他域访问服务器上的API,CSRF用于确保表单发布来自您期望的页面。
理查德·萨雷

52

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添加到要保护的操作方法中。
Chandra Malla 2015年

感谢您提供这个简单易懂的答案:)
noobprogrammer

4

在ASP.Net Core中,防伪令牌会自动添加到表单中,因此,@Html.AntiForgeryToken()如果您使用razor表单元素或使用IHtmlHelper.BeginForm,并且表单的方法不是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


2

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

来自 Harpreet Singh的MVC应用程序中ValidateAntiForgeryToken的用途

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. 现在,在程序包管理器控制台中运行下面提到的三个命令来创建数据库。

启用迁移添加迁移优先更新数据库

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

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

http:// localhost:52269 /帐户/注册

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

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

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

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

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

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

“ /”应用程序中的服务器错误。________________________________________不存在必需的防伪cookie“ __RequestVerificationToken”。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.