在阅读有关XSS攻击后,我已使用本文中描述的ValidateAntiForgeryTokenWrapperAttribute将AntiForgeryToken应用于我的网站:
它似乎运行良好但是我在MVC3中使用远程验证时遇到了问题。我有一个ValidationController,其中包含我网站中的所有常见验证,如果我将ValidateAntiForgeryTokenWrapperAttribute应用于它,那么远程验证不再有效,我得到一个'所提供的必需的防伪令牌未被提供或无效。'在Elmah中记录的异常。我试过调试它,它甚至没有在抛出异常之前点击控制器动作。我认为这是因为远程验证不知道将AntiForgeryToken传递给控制器 - 是否有其他人遇到过这个问题或者知道这两个是不是一起使用?
它还让我怀疑我是否应该在每个控制器上使用ValidateAntiForgeryTokenWrapperAttribute,是否有任何想法?
答案 0 :(得分:3)
在远程属性中执行以下操作:
[Remote("MyValidationMethod","MyController", HttpMethod = "POST", AdditionalFields = "__RequestVerificationToken")]
public object MyField { get; set; }
AdditionalFields属性可以接受表单中逗号分隔的字段名称; __RequestVerificationToken是包含AntiForgeryToken的隐藏字段的名称。
答案 1 :(得分: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 ()
{ }
}