4

在阅读了有关 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,有什么想法吗?

4

2 回答 2

5

在远程属性中执行以下操作:

[Remote("MyValidationMethod","MyController", HttpMethod = "POST", AdditionalFields = "__RequestVerificationToken")]
public object MyField { get; set; }

AdditionalFields 属性可以接受表单中以逗号分隔的字段名称;__RequestVerificationToken 是包含 AntiForgeryToken 的隐藏字段的名称。

于 2011-07-21T11:59:07.570 回答
0

我没有使用远程验证。但是我对 AntiForgeryToken 有类似的经验。当我将它应用于我的控制器中的所有操作时。后来,我将其从所有操作中删除,并仅应用于那些将数据发送回数据库的操作(插入/更新/删除)。

似乎您已将 AntiForgeryToken 验证属性应用于整个控制器,每次执行操作时它总是会创建一个新的令牌值,因此当响应返回客户端进行远程验证操作时,令牌的值与稍后提交以进行其他操作的表单。

您可以从控制器中删除 AntiForgeryToken 属性,并将其与远程验证操作之外的其他操作或您真正需要的任何地方一起使用。

//Instead of this
[ValidateAntiForgeryToken]
public class mycontroller
{
//...
}    

//Do something like this
public class mycontroller
{    
    public ActionResult myotheraction () 
    { }

    [ValidateAntiForgeryToken]
    public ActionResult valdaitionaction () 
    { }
}
于 2011-07-21T11:57:17.083 回答