如果每个表单都提交了加密的 ASP.NET Viewstate,并控制 POST,这是否意味着 ASP.NET 比其他解决方案更不容易受到 CSRF 的攻击?
这种保护的范围和限制是什么?
由于在 ASP.NET MVC 中默认情况下未实现 AntiForgeryToken,这是否意味着这些站点更有可能面临风险?
如果每个表单都提交了加密的 ASP.NET Viewstate,并控制 POST,这是否意味着 ASP.NET 比其他解决方案更不容易受到 CSRF 的攻击?
这种保护的范围和限制是什么?
由于在 ASP.NET MVC 中默认情况下未实现 AntiForgeryToken,这是否意味着这些站点更有可能面临风险?
ASP.NET ViewState 的目的是在回发之间保持控制状态(参见MDSN 解释),它不会隐式启用会阻止 CSRF 的安全性。
另请注意,未修补的旧版本 ASP.NET 中的加密 ViewState 容易受到加密漏洞的影响。
要启用这种类型的保护,您可以:
使用 ViewStateUserKey(请参阅该功能的高级描述、 ViewStateUserKey 的 MSDN 文档和OWASP CSRF 预防备忘单。
使用自定义方法在表单中呈现自定义托管隐藏字段(每个事务),并在每个客户端请求中检查它。
[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.1 中引入了一个解决方案。您可以使用 ViewStateUser-Key 而不是仅使用 _viewstate 。这使用使用会话密钥来创建状态令牌,攻击者很难猜测或复制。
我仍然建议在您的应用程序中实施一个独立的 CSRF 令牌机制来防止 CSRF(我知道很多人会对此有所不同)