【问题标题】:MVC3 Remote Validation and AntiForgeryTokenMVC3 远程验证和 AntiForgeryToken
【发布时间】:2011-10-07 17:34:18
【问题描述】:
在阅读了有关 XSS 攻击的信息后,我已使用本文中描述的 ValidateAntiForgeryTokenWrapperAttribute 将 AntiForgeryToken 应用于我的网站:
http://weblogs.asp.net/dixin/archive/2010/05/22/anti-forgery-request-recipes-for-asp-net-mvc-and-ajax.aspx
它似乎运行良好,但是我在 MVC3 中使用远程验证时遇到了一个问题。我有一个 ValidationController,其中包含我的站点中的所有常见验证,如果我将 ValidateAntiForgeryTokenWrapperAttribute 应用于它,那么远程验证将不再有效,并且我得到一个“未提供所需的防伪令牌或无效。”异常记录在 Elmah 中。我已经尝试过调试它,它甚至在抛出异常之前都没有触发控制器动作。我认为发生这种情况是因为远程验证不知道将 AntiForgeryToken 传递给控制器 - 有没有其他人遇到过这个问题或知道这两者是否不适合一起使用?
这也让我质疑我是否应该在每个控制器上使用 ValidateAntiForgeryTokenWrapperAttribute,有什么想法吗?
【问题讨论】:
标签:
asp.net-mvc
asp.net-mvc-3
attributes
xss
antiforgerytoken
【解决方案1】:
我没有使用远程验证。但是我对 AntiForgeryToken 有类似的经验。当我将它应用于我的控制器中的所有操作时。后来,我将其从所有操作中删除,并仅应用于那些将数据发送回数据库的操作(插入/更新/删除)。
您似乎已将 AntiForgeryToken 验证属性应用于整个控制器,每次执行操作时它总是会创建一个新的令牌值,因此当响应返回客户端进行远程验证操作时,令牌的值不同于位于稍后提交以进行其他操作的表单上。
您可以从控制器中移除 AntiForgeryToken 属性,并将其与远程验证操作之外的其他操作或您真正需要的任何地方一起使用。
//Instead of this
[ValidateAntiForgeryToken]
public class mycontroller
{
//...
}
//Do something like this
public class mycontroller
{
public ActionResult myotheraction ()
{ }
[ValidateAntiForgeryToken]
public ActionResult valdaitionaction ()
{ }
}
【解决方案2】:
在远程属性中如下:
[Remote("MyValidationMethod","MyController", HttpMethod = "POST", AdditionalFields = "__RequestVerificationToken")]
public object MyField { get; set; }
AdditionalFields 属性可以接受表单中以逗号分隔的字段名称; __RequestVerificationToken 是包含 AntiForgeryToken 的隐藏字段的名称。