=======================================一、防止跨站脚本攻击(XSS)
①: @Html.Encode("<script>alert('123')</script>")
编码后:<script>alert('123')</script>
②: @Html.AttributeEncode("<script>alert('123')</script>")
编码后:<script>alert('123')</script>
③: @Html.JavascriptEncode()
③: 使用antixss库防御
=======================================二、防止跨站请求伪造(CSRF)
①: 令牌验证(用于表单验证)
在提交表单中加上@Html.AntiForgeryToken(),在控制器中加上[ValidateAntiforgeryToken]
②: HttpReferrer验证(get、post)
新建一个类,继承AuthorizeAttribute(在提交的时候验证):
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace SchoolManageDomw.Models { public class IsPostedThisSiteAttribute:AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (filterContext.HttpContext != null) { if (filterContext.HttpContext.Request.UrlReferrer == null) throw new Exception("客户端请求的信息为空"); if (filterContext.HttpContext.Request.UrlReferrer.Host != "localhost")//MySite.com throw new Exception("不安全的请求"); } } } }
控制器里使用:
[IsPostedThisSite] public ActionResult LogOff() { FormsAuthentication.SignOut(); return RedirectToAction("Index", "Home"); }
=======================================三、cookie窃盗
1,cookie主要有两种形式:
①:会话cookie:会话cookie存储在浏览器的内容中,在浏览器的每次请求中通过http头传递
②:持久性cookie:持久性cookie存储于计算机的实际文件中,并与会话cookie以相同的方式传递
2,使用HttpOnly阻止cookie窃盗
①:web.config文件中对所有cookie进行设置
(停止脚步对站点的cookie访问)
<system.web>
<httpCookies domain="" httpOnlyCookies="true" requireSSL="false"/>
</system.web>
②:在程序中为编写的每一个cookie单独设置
(除了服务器修改或设置cookie之外,其他一些对cookie的操作均无效)
Response.Cookies["MyCookie"].Value = "userid";
Response.Cookies["MyCookie"].HttpOnly = true;
=======================================四、重复提交
①:使用白名单指定允许绑定的字段
[Bind(Include="Name,Content")]
②:使用黑名单排除禁止绑定的字段
[Bind(Exclude="Price,OrderID")]
可以用在模型类中,也可以用在控制器操作参数中
例:
模型中使用:
[Bind(Include="Name,Content")]
public class product()
控制器操作参数中使用:
public ActionResult Edit([Bind(Include = "STU_NAME,STU_MONEY")]PersonError p, string returnUrl)
=======================================五、开放重定向
1,例子:
比如你是工商银行,我是一个罪犯。
你的网站叫 www.icbc.com.cn,我建立了一个网站叫 www.icbc888.cn,我让网站看起来和你的一样。
我在论坛上发布这样一个帖子:
快来啊,工商银行派发红包啦,点这里:http://www.icbc.com.cn/account/login?returnUrl=www.icbc888.cn。用户看起来会觉得这个链接是工商银行的,但是当它点进去以后,会被跳转到www.icbc888.cn,后面的事情你可以想象到。
2,控制器代码(登录):
returnUrl:重定向的路径
[HttpPost] public ActionResult LogOn(LogOnModel model, string returnUrl) { if (ModelState.IsValid) { if (Membership.ValidateUser(model.UserName, model.Password)) { FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); //做安全判断 if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Home"); } } else { ModelState.AddModelError("", "提供的用户名或密码不正确。"); } } // 如果我们进行到这一步时某个地方出错,则重新显示表单 return View(model); }
=======================================六、适当的错误报告和堆栈跟踪
<customErrors mode="Off"></customErrors>
On:服务器开发的最安全选项,因为它总是隐藏错误提示消息
RemoteOnly:向大多数用户展示一般的错误提示消息,但向拥有服务器访问权限的用户
展示完整的错误提示消息
Off:最容易受到攻击的选项,它向访问网站的每个用户展示详细的错误提示消息
<customErrors mode="On" redirectMode="ResponseRedirect" defaultRedirect="~/Home/Index">
<!--服务器返回404错误跳转的指定页面-->
<error redirect="~/Home/Index" statusCode="404"/>
</customErrors>