模型绑定是ASP.NET MVC提供的强大功能,可遵照命名约定将输入元素映射到模型属性,从而极大地简化了处理用户输入的过程,然而,这也成为了攻击的另一种没接,给攻击者提供了一个填充模型属性的机会,右下时候填充的这些属性甚至都没有在输入表单中。
使用 [Bing] 特性防御重复提交攻击
1、可以使用Bing白名单来指定模型绑定的字段,比如 [Bing(Include="Name,Comment")]
也可以使用黑名单来排除禁止绑定的字段,比如 [Bind(Exclude="ID,DateTime")]
一般情况下,白名单比黑名单更安全一些。
[Bind(Include="Name,Comment")]
public class Review{
public string ID{get;set;}
public string Name{get;set;}
public string Comment{get;set;}
}
2、另一种方法是使用UpdateModel或者TryUpdateModel方法来接收一个绑定列表,例如:
UpdateModel(review,"Review",new string[]{"Name","Comment"})
3、避免直接绑定到数据模型也是有效防御重复提交攻击的一种方式。通过一个视图模型,只缓存允许用户设置的属性来阻止攻击。