- 阻止CSRF(跨站请求伪造)
ASP.NET MVC提供了一个阻止CSRF攻击的好方法
在每个提交的表单中包含
@using (Html.BeginForm("Index", "Home", FormMethod.Post)) { //调用@Html.AntiForgeryToken()生成一个防伪标记 @Html.AntiForgeryToken() <input type="text" name="text"/> <input type="submit" value="提交" /> }
在请求的控制器的控制器操作上声明[ValidateAntiForgeryToken]特性
[ValidateAntiForgeryToken] public ActionResult Index(string text) { ......... return View(); }
- HttpReferrer验证
验证提交表单的客户端是否在目标站点上
public class IsPostendFromThisSiteAttribute :AuthorizeAttribute { public override void OnAuthorize(AuthorizationContext filterContext) { if(filterContext.httpContext!=null) { if(filterContext.httpContext.Request.UrlReferrer==null) { throw new System.Web.HttpException("无效提交"); } if(filterContext.httpContext.Request.UrlReferrer.Host=!="mysite.com") { throw new System.Web.HttpException("非法的提交站点""); } } } }
然后再添加自定义的过滤器
[IsPostedFromThisSite] public ActionResult Register(…)
- 使用HttpOnly防止Cookie被盗窃获取
可以在程序中为编写的每个cookie单独设置,告知浏览器除了服务器能修改设置Cookie之外,其他的操作均无效
Respone.Cookies["password"]="123456"; Respone.Cookies["password"].HttpOnly=true;
- 使用Bind特效防御重复提交攻击
Bind特效既可以放在模型类上,也可以放在控制器上。
- 白名单方法允许绑定的字段如:[Bind(Include=“Name,Age”)]
- 或是黑名单禁止绑定的字段:[Bind(Exclude=“StduentID”)]
- 或是直接绑定到视图模型,直接包含自己想要绑定的字段