ASP.NET Viewstate 是否隐式阻止 CSRF 攻击?这对 MVC 意味着什么?

信息安全 csrf asp.net-mvc
2021-08-13 04:44:42

如果每个表单都提交了加密的 ASP.NET Viewstate,并控制 POST,这是否意味着 ASP.NET 比其他解决方案更不容易受到 CSRF 的攻击?

这种保护的范围和限制是什么?

由于在 ASP.NET MVC 中默认情况下未实现 AntiForgeryToken,这是否意味着这些站点更有可能面临风险?

2个回答

ASP.NET ViewState 的目的是在回发之间保持控制状态(参见MDSN 解释),它不会隐式启用会阻止 CSRF 的安全性。

另请注意,未修补的旧版本 ASP.NET 中的加密 ViewState 容易受到加密漏洞的影响。

要启用这种类型的保护,您可以:

[ValidateAntiForgeryToken]ASP.NET MVC3 确实具有与控制器操作上的属性一起使用的防伪令牌(请参阅http://msdn.microsoft.com/en-us/library/system.web.mvc.validateantiforgerytokenattribute.aspx)。在视图的表单标记中,使用以下语法调用Html.AntiForgeryToken帮助程序(参见http://msdn.microsoft.com/en-us/library/dd470175.aspx ):

网络表格:

<%= Html.AntiForgeryToken() %>

剃刀:

@Html.AntiForgeryToken()

使用视图状态很难对应用程序执行成功的 CSRF 攻击,但并非不可能。使用 _viewstate 对应用程序进行成功的 CSRF 攻击的一种方法是

  1. 攻击者能够登录到应用程序(使用自己的或获取的凭据)
  2. 访问她想要针对其创建 CSRF 攻击的页面(具有最常见或最有用的变量状态)
  3. 复制 _Viewstate
  4. 在她的攻击页面中插入这个 _viewstate
  5. 将攻击页面发送给受害者
  6. 如果运气好,并且很好地猜测,攻击可能会奏效

在 1.1 中引入了一个解决方案。您可以使用 ViewStateUser-Key 而不是仅使用 _viewstate 。这使用使用会话密钥来创建状态令牌,攻击者很难猜测或复制。

我仍然建议在您的应用程序中实施一个独立的 CSRF 令牌机制来防止 CSRF(我知道很多人会对此有所不同)