ASP.NET MVC Ajax 请求安全
2015-10-19 00:23
585 查看
1.前言
ASP.NET MVC 应用通过使用AJAX请求来提升用户体验。AJAX请求不会刷新整个页面,用户几乎感知不到请求的发送和处理过程,正是这样,AJAX请求的安全性就十分重要了,如果有人伪造了请求,就很容易对应用进行攻击,从而泄露核心数据,导致安全问题。
2.解决方案
如何确保AJAX请求没有被伪造呢?解决办法就是在AJAX请求发起时传递给后台一个字符串,然后在Filter中进行校验。
3.例子
1)Model
修改AJAX请求的字符串后
ASP.NET MVC 应用通过使用AJAX请求来提升用户体验。AJAX请求不会刷新整个页面,用户几乎感知不到请求的发送和处理过程,正是这样,AJAX请求的安全性就十分重要了,如果有人伪造了请求,就很容易对应用进行攻击,从而泄露核心数据,导致安全问题。
2.解决方案
如何确保AJAX请求没有被伪造呢?解决办法就是在AJAX请求发起时传递给后台一个字符串,然后在Filter中进行校验。
3.例子
1)Model
namespace AntiForgeryTokenDemo.Models { public class Person { private string name; public string Name { get { return name; } set { name = value; } } private string age; public string Age { get { return age; } set { age = value; } } } }2)Index.cshtml
@model AntiForgeryTokenDemo.Models.Person @{ ViewBag.Title = "Home Page"; } <script src="~/Scripts/jquery-1.10.2.js"></script> <script src="~/Scripts/jquery.validate.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.js"></script> <h2>Index</h2> <form id="form1"> <div class="form-horizontal"> <h4>Persen</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Age, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Age, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Age, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="button" id="save" value="Create" class="btn btn-default" /> </div> </div> </div> </form> <script type="text/javascript"> $(function () { //var token = $('[name=__RequestVerificationToken]'); //获取防伪标记 var token = $('@Html.AntiForgeryToken()').val(); var headers = {}; //防伪标记放入headers //也可以将防伪标记放入data headers["__RequestVerificationToken"] = token; $("#save").click(function () { $.ajax({ type: 'POST', url: '/Home/Index', cache: false, headers: headers, data: { Name: $("#Name").val(), Age: $("#Age").val() }, success: function (data) { alert(data) }, error: function () { alert("Error") } }); }) }) </script>3)Controller
public class HomeController : Controller { public ActionResult Index() { return View(); } [HttpPost] [MyValidateAntiForgeryToken] public ActionResult Index(Person p) { return Json(true, JsonRequestBehavior.AllowGet); } public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } }4)Filter
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web; using System.Web.Helpers; using System.Web.Mvc; namespace AntiForgeryTokenDemo.Filters { public class MyValidateAntiForgeryToken : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { var request = filterContext.HttpContext.Request; if (request.HttpMethod == WebRequestMethods.Http.Post) { if (request.IsAjaxRequest()) { var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName]; var cookieValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null; //从cookies 和 Headers 中 验证防伪标记 //这里可以加try-catch AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]); } else { new ValidateAntiForgeryTokenAttribute() .OnAuthorization(filterContext); } } } } }3.效果
修改AJAX请求的字符串后
相关文章推荐
- 区分ASP.NET中get方法和post方法
- 菜鸟的 asp.net jsonp简单应用
- asp.net 回发或回调参数无效的各种情况分析及解决办法
- ASP.NET5 Beta8
- ASP.NET程序单客户端(浏览器)登录的实现方案
- [ASP.NET MVC] 使用CLK.AspNet.Identity提供依权限显示选单项目的功能
- ASP.NET5 Beta8可用性
- 理解ASP.NET MVC的路由系统
- asp用户控件的使用
- asp.net的自定义控件和用户控件的区别
- ASP.NET比较常用的26个性能优化技巧
- 数据注解和验证 – ASP.NET MVC 4 系列
- ASP.NET比较常用的26个性能优化技巧
- ASP.NET开发者必备小技巧
- Asp.net(c#)常用文件操作类封装 移动 复制 删除 上传 下载等
- ASP.NET访问权限管理
- 编写通用的ASP防SQL注入攻击程序
- 截取指定长度文字,超出部分以特定字符代替
- ASP.NET - 编写让别人能读懂的代码
- ASP.NET - 使用MqSql数据库