Tab*_*ayi 294 c# asp.net-mvc asp.net-mvc-4
你能解释一下ValidateAntiForgeryToken的用途并向我展示ValidateAntiForgeryTokenMVC 4的例子吗?
我找不到任何解释这个属性的例子?
Ric*_*lay 342
MVC的防伪支持为仅HTTP的cookie写入一个唯一值,然后将相同的值写入表单.提交页面时,如果cookie值与表单值不匹配,则会引发错误.
请务必注意,该功能可防止跨站点请求伪造.也就是说,来自其他网站的表单会发布到您的网站,尝试使用经过身份验证的用户凭据提交隐藏的内容.攻击涉及欺骗登录用户提交表单,或者只是在页面加载时以编程方式触发表单.
该功能不会阻止任何其他类型的数据伪造或篡改攻击.
要使用它,请使用ValidateAntiForgeryToken属性修饰操作方法或控制器,并@Html.AntiForgeryToken()在表单发布到方法中进行调用.
小智 49
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);
}
Run Code Online (Sandbox Code Playgroud)
它派生自System.Web.Mvc命名空间.
在您的视图中,添加此代码以添加令牌,以便在提交时用于验证表单.
@Html.AntiForgeryToken()
Run Code Online (Sandbox Code Playgroud)
tsc*_*ors 11
在 ASP.Net Core 中,防伪令牌会自动添加到表单中,因此@Html.AntiForgeryToken()如果您使用 razor 表单元素或使用 IHtmlHelper.BeginForm 并且表单的方法不是 GET,则不需要添加。
它将为您的表单生成类似于以下内容的输入元素:
<input name="__RequestVerificationToken" type="hidden"
value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">
Run Code Online (Sandbox Code Playgroud)
并且当用户提交表单时,如果启用了验证,则会在服务器端验证此令牌。
[ValidateAntiForgeryToken]属性可用于操作。除非请求包含有效的防伪令牌,否则对应用此过滤器的操作发出的请求将被阻止。
[AutoValidateAntiforgeryToken]属性可用于控制器。此属性与 ValidateAntiForgeryToken 属性的工作方式相同,不同之处在于它不需要使用以下 HTTP 方法发出的请求的令牌:
GET HEAD OPTIONS TRACE
附加信息: docs.microsoft.com/aspnet/core/security/anti-request-forgery
小智 5
Microsoft 为我们提供了我们在应用程序中出于安全目的使用的内置功能,因此没有人可以入侵我们的网站或入侵某些关键信息。
来自Harpreet Singh MVC 应用程序中 ValidateAntiForgeryToken 的目的:
ValidateAntiForgeryToken 的使用
让我们尝试用一个简单的例子来理解这个概念。我不想让它太复杂,这就是为什么我要使用 MVC 应用程序的模板,它已经在 Visual Studio 中可用。我们将一步一步地做到这一点。开始吧。
步骤 1 - 使用默认 Internet 模板创建两个 MVC 应用程序,并将这些名称分别命名为 CrossSite_RequestForgery 和 Attack_Application。
现在,打开 CrossSite_RequestForgery 应用程序的 Web Config 并使用下面给出的连接字符串更改连接字符串,然后保存。
`
Run Code Online (Sandbox Code Playgroud)<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF; Integrated Security=true;" providerName="System.Data.SqlClient" /> </connectionStrings>
现在,单击工具>> NuGet 包管理器,然后单击包管理器控制台
现在,在包管理器控制台中运行下面提到的三个命令来创建数据库。
Enable-Migrations add-migration first update-database
重要说明 - 我使用代码优先方法创建了数据库,因为我想以开发人员的工作方式制作这个示例。您也可以手动创建数据库。这是你的选择。
- 现在,打开帐户控制器。在这里,您将看到一个类型为 post 的 register 方法。在这个方法之上,应该有一个可用的属性作为 [ValidateAntiForgeryToken]。注释此属性。现在,右键单击注册并单击转到查看。再次,您将找到一个 html 帮助程序,如 @Html.AntiForgeryToken() 。也评论这个。运行应用程序并单击注册按钮。该 URL 将打开为:
http://localhost:52269/Account/Register
注释- 我现在知道所有读者心中提出的问题是为什么需要注释这两个助手,因为每个人都知道它们用于验证请求。然后,我只想让大家知道,这只是因为我想展示应用这些助手之前和之后的区别。
现在,打开第二个应用程序 Attack_Application。然后,打开 Account Controller 的 Register 方法。只需使用简单的方法更改 POST 方法,如下所示。
报名表格
- @Html.LabelFor(m => m.UserName) @Html.TextBoxFor(m => m.UserName)
- @Html.LabelFor(m => m.Password) @Html.PasswordFor(m => m.Password)
- @Html.LabelFor(m => m.ConfirmPassword) @Html.PasswordFor(m => m.ConfirmPassword)
7.现在,假设您是一名黑客,并且您知道可以在 CrossSite_RequestForgery 应用程序中注册用户的 URL。现在,您创建了一个伪造站点作为 Attacker_Application 并在 post 方法中放置相同的 URL。
8.立即运行此应用程序并填写注册字段并单击注册。您将看到您已在 CrossSite_RequestForgery 应用程序中注册。如果您检查 CrossSite_RequestForgery 应用程序的数据库,那么您将看到您输入的条目。
- 重要 - 现在,打开 CrossSite_RequestForgery 应用程序并注释掉帐户控制器中的令牌并注册视图。尝试使用相同的过程再次注册。然后,将发生如下错误。
“/”应用程序中的服务器错误。________________________________________ 所需的防伪 cookie“__RequestVerificationToken”不存在。
这就是概念所说的。我们在 View 中添加的内容,即 @Html.AntiForgeryToken() 在加载时生成 __RequestVerificationToken 和在 Controller 方法上可用的 [ValidateAntiForgeryToken]。在发布时间匹配此令牌。如果令牌相同,则表示这是一个有效的请求。
| 归档时间: |
|
| 查看次数: |
178857 次 |
| 最近记录: |