架构师_程序员_码农网

查看: 63|回复: 0

[资料] ValidateAntiForgeryToken 和 AutoValidateAntiforgeryToken 防伪造标记详解

[复制链接]
发表于 2021-2-20 19:57:29 | 显示全部楼层
在防止 CSRF 攻击,asp.net mvc 提供了 ValidateAntiForgeryToken 防伪造攻击的特性,在新版的 asp.net core 框架微软又提供了 AutoValidateAntiforgeryToken 特性,具体 ValidateAntiForgeryToken 和 AutoValidateAntiforgeryToken 有什么区别,本文将做详细的讲解。

mvc ajax带上AntiForgeryToken防止CSRF攻击
https://www.itsvse.com/thread-4207-1-1.html

ASP.NET CSRF 攻击Ajax请求封装
https://www.itsvse.com/thread-8077-1-1.html
CSRF概念

CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 如下:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。


ASP.NET MVC 防 CSRF 攻击

在 view 页面,使用 @Html.AntiForgeryToken() 添加标记,用户访问页面的时候,后端会自动把该标记生成一段隐藏的 html 代码,如下:


<input name="__RequestVerificationToken" type="hidden" value="CfDJ8FBn4LzSYglJpE6Q0fWvZ8WDMTgwK49lDU1XGuP5-5j4JlSCML_IDOO3XDL5EOyI_mS2Ux7lLSfI7ASQnIIxo2ScEJvnABf9v51TUZl_iM2S63zuiPK4lcXRPa_KUUDbK-LS4HD16pJusFRppj-dEGc" />
后台控制器需要设置 [ValidateAntiForgeryToken] 特性,就可以防止伪造表单提交。

ValidateAntiForgeryToken 和 AutoValidateAntiforgeryToken 区别

AutoValidateAntiforgeryTokenAuthorizationFilter是继承了ValidateAntiforgeryTokenAuthorizationFilter,只重写了其中的ShouldValidate方法。

AutoValidateAntiforgeryToken 导致对所有不安全的HTTP方法的防伪令牌进行验证的属性。除GET,HEAD,OPTIONS和TRACE之外的HTTP方法均需要防伪令牌。可以将其作为全局过滤器应用,以默认情况下触发应用程序的防伪令牌验证。

https://github.com/dotnet/aspnetcore/blob/c925f99cddac0df90ed0bc4a07ecda6b054a0b02/src/Mvc/Mvc.ViewFeatures/src/Filters/AutoValidateAntiforgeryTokenAuthorizationFilter.cs

AutoValidateAntiforgeryTokenAttribute 验证调用的 AutoValidateAntiforgeryTokenAuthorizationFilter,AutoValidateAntiforgeryTokenAuthorizationFilter 继承于 ValidateAntiforgeryTokenAuthorizationFilter,重写了  ShouldValidate 方法,返回 true 就是需要验证,返回 false 将不做验证,如下图:

分析源码:

QQ截图20210220195125.jpg

AutoValidateAntiforgeryTokenAttribute允许将防伪令牌验证全局应用于所有不安全的方法,例如POST, PUT, PATCH and DELETE。因此,您不需要将[ValidateAntiForgeryToken]属性添加到需要它的每个动作中。

要使用它,请将以下代码添加到您ConfigureServices的Startup类方法中:


如果您需要忽略防伪验证,则可以将[IgnoreAntiforgeryToken]属性添加到操作中。

有时您可能会发现自己需要在一个控制器上标记多个请求,而同时又需要一些请求不需要伪造,例如各种基于GET的操作。您可以使用多种工具来使过程变得更加方便和舒适。第一个是AutoValidateAntiforgeryToken属性。它的行为类似于ValidateAntiForgeryToken属性。但是,它将自动忽略为数据检索而设计的方法所调用的动作:GET,HEAD,OPTIONS和TRACE。这使您可以快速轻松地将防伪造方法添加到所有可以更改数据的方法中,而不会影响检索数据的方法。

以下代码是AutoValidateAntiforgeryToken属性的示例:


在此示例中,正常的Index操作(GET)都将起作用,而与来源无关,而带有POST方法的Index操作和作为Delete方法的RemoveUser操作都将要求客户端使用防伪令牌。

自定义相关信息

可能会有不少人觉得,像那个生成的隐藏域那个name能不能换成自己的,那个cookie的名字能不能换成自己的〜〜

答案是肯定可以的,下面简单示范一下:

在Startup的ConfigureServices方法中,添加下面的内容即可对默认的名称进行相应的修改。


注意:asp.net core 和 asp.net 最大的区别是,core 支持通过请求 header 来传递验证参数,并非要 form 表单传递!

private const string AntiforgeryTokenFieldName = "__RequestVerificationToken";
private const string AntiforgeryTokenHeaderName = "RequestVerificationToken";


可以查看源码:https://github.com/dotnet/aspnetcore/blob/c925f99cddac0df90ed0bc4a07ecda6b054a0b02/src/Antiforgery/src/Internal/DefaultAntiforgery.cs

测试代码:



4bc0ce36-17f1-412e-a0aa-9376ccc71c49.png

结果:尝试访问 test1 方法,会返回 400 错误,访问 test2 方法,会返回我们传入的str参数,可以看到 AutoValidateAntiforgeryToken 特性不会拦截GET请求。

(完)




上一篇:Fiddler 替换链接、请求转发重定向
下一篇:[转]SQL Server SQL Count 中加条件
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2021-3-1 08:27

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表