1.前言

CSRF(Cross-site request forgery)跨站请求伪造,ASP.NET MVC 应用通过使用AJAX请求来提升用户体验,浏览器开发者工具可以一览众山小,就很容易伪造了请求对应用进行攻击,从而泄露核心数据,导致安全问题。微软自带AntiForgeryToken可以解决,而且语法简单(AJAX请求发起时传递给后台一个字符串,然后在Filter中进行校验)

2.场景如下

为了验证一个来自form post请求,还需要在目标action上增加自定义[AntiForgeryToken]特性,下面会介绍到这个自定义特性用法

  1. /// <summary>
  2. /// 首页
  3. /// </summary>
  4. public class HomeController : Controller
  5. {
  6.  
  7. /// <summary>
  8. /// 用户登录了111111
  9. /// </summary>
  10. /// <returns></returns>
  11. public ActionResult Index()
  12. {
  13. return View();
  14. }
  15.  
  16. /// <summary>
  17. /// Your application description page.
  18. /// </summary>
  19. /// <returns></returns>
  20. public ActionResult About()
  21. {
  22. ViewBag.Message = "Your application description page.";
  23. return View();
  24. }
  25.  
  26. /// <summary>
  27. /// Your contact page.
  28. /// </summary>
  29. /// <param name="name">姓名</param>
  30. /// <returns></returns>
  31. public ActionResult Contact(string name)
  32. {
  33. ViewBag.Message = "Your contact page.";
  34. return View();
  35. }
  36.  
  37. /// <summary>
  38. ///
  39. /// </summary>
  40. /// <returns></returns>
  41. public ActionResult Person()
  42. {
  43. return View();
  44. }
  45.  
  46. /// <summary>
  47. ///
  48. /// </summary>
  49. /// <param name="Name"></param>
  50. /// <param name="Age"></param>
  51. /// <returns></returns>
  52. [HttpPost]
  53. [AntiForgeryToken]
  54. public ActionResult UserInfo(string Name,string Age)
  55. {
  56. return Json(Name + Age);
  57. }
  58.  
  59. }

前端html中如何防范?

一句语法糖解决所有问题,通过在html页面上或者script中使用 Html.AntiForgeryToken(),然后赋值给ajax中headers

html页面上

1.html中使用@Html.AntiForgeryToken(),然后通过jquery中name,获取隐藏域value的值,再赋值给ajax中headers

2.var headToken=$('input[name="__RequestVerificationToken"]').val();

script中

  1. <html>
  2. <head>
  3. <meta name="viewport" content="width=device-width" />
  4. <title>Person</title>
  5. <script src="~/Scripts/jquery-3.3.1.min.js"></script>
  6. <script src="~/Scripts/jquery.validate.js"></script>
  7. <script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
  8. </head>
  9. <body>
  10. <form id="form1">
        @*@Html.AntiForgeryToken()*@
  11. <div class="form-horizontal">
  12. <div class="form-group">
  13. <div>
  14. 姓名:<input type="text" name="name" value="" id="name" />
  15. 密码: <input type="text" name="age" value="" id="age" />
  16. </div>
  17.  
  18. <div class="col-md-offset-2 col-md-10">
  19. <input type="button" id="save" value="Create" class="btn btn-default" />
  20. </div>
  21. </div>
  22. </div>
  23. </form>
  24.  
  25. <script>
  26. $(function () {
  27.  
  28. //获取防伪标记
  29. var token = $('@Html.AntiForgeryToken()').val();
  30. var headers = {};
  31. //防伪标记放入headers
  32. //也可以将防伪标记放入data
  33. headers["__RequestVerificationToken"] = token;
  34. $("#save").click(function () {
  35. $.ajax({
  36. type: 'POST',
  37. url: '/Home/UserInfo',
  38. cache: false,
  39. headers: headers,
  40. data: { Name: $("#name").val(), Age: $("#age").val() },
  41. success: function (data) {
  42. alert(data)
  43. },
  44. error: function () {
  45. alert("Error")
  46. }
  47. });
  48. })
  49.  
  50. });
  51. </script>
  52. </body>
  53. </html>

3.自定义AuthorizeAttribute属性

它主要检查

(1)请求的是否包含一个约定的AntiForgery名的cookie

(2)请求Headers是否有一个["__RequestVerificationToken"],并且不能为空,约定的AntiForgery名的cookie和Headers中的值是否匹配

  1. public class AntiForgeryToken : AuthorizeAttribute
  2. {
  3. /// <summary>
  4. ///
  5. /// </summary>
  6. /// <param name="filterContext"></param>
  7. public override void OnAuthorization(AuthorizationContext filterContext)
  8. {
  9.  
  10. var request = filterContext.HttpContext.Request;
  11.  
  12. if (request.IsAjaxRequest())
  13. {
  14. var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
  15.  
  16. var cookieValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null;
  17. var headerValue = request.Headers["__RequestVerificationToken"];
  18. //获取head中的值 如果为空直接拒绝不往下走
  19. if (string.IsNullOrEmpty(headerValue))
  20. {
  21. base.OnAuthorization(filterContext);
  22. return;
  23. }
  24.  
  25. //从cookies 和 Headers 中 验证防伪标记
  26. AntiForgery.Validate(cookieValue,headerValue);
  27.  
  28. }
  29. }
  30. }

ASP.NET MVC Ajax 伪造请求的更多相关文章

  1. ASP.NET MVC AJAX 请求中加入 antiforgerytoken 解决“所需的防伪表单字段“__RequestVerificationToken”不存在”问题

    在ASP.NET mvc中如果在表中使用了@Html.AntiForgeryToken(),ajax post不会请求成功 解决方法是在ajax中加入__RequestVerificationToke ...

  2. ASP.NET MVC ajax处理 AjaxResult

    1.统一ASPNET MVC 对ajax请求响应格式定义,方便前端统一处理ajax结果. 1)定义程序返回结果数据格式 /// <summary> /// 执行结果 /// </su ...

  3. ASP.NET MVC Ajax.ActionLink 简单用法

    ASP.NET MVC 项目中,如何使用类似于 iframe 的效果呢?或者说 Ajax 局部刷新,比如下面操作: 我们想要的效果是,点击 About 链接,页面不刷新(地址栏不变),然后下面的内容进 ...

  4. Asp.Net MVC ajax调用 .net 类库问题

    如果你还在为 ajax 调用 .net 类库还束手无策的话,相信这篇博客将帮助你解决这个世纪问题! 因为Visual Studio 内置了asp.net mvc ,不过当你添加asp.net mvc项 ...

  5. Asp.Net MVC Ajax

    将ASP.NET MVC中的form提交改为ajax提交 在ASP.NET MVC视图中通过 @using (Html.BeginForm()) 产生的是form表单提交代码,可以用javascrip ...

  6. 详解ASP.NET MVC应用程序请求生命周期

    ------转载当一个ASP.NET MVC应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在ASP.NET MVC应用程序Http request 和Http response 过程中, ...

  7. asp.net MVC ajax 请求参数前台加密后台解密

    最近有一个需求要求页面查询数据库,查询内容保存到excel里面作为附件加密打包下载.查询的sql作为参数传入后台,实现加密提交.这里做个记录,后面用到直接来拿. 控制器 public ActionRe ...

  8. ASP.NET MVC AJAX的调用示例

    @{ ViewBag.Title = "Home Page"; //下面引用Jquery和unobtrusive-ajax } @Scripts.Render("~/bu ...

  9. asp.net mvc ajax FileUpload

    //后台代码 [HttpPost] public ActionResult CreateCategory(HttpPostedFileBase file) { string url = Upload( ...

随机推荐

  1. 转---tcp三次握手四次挥手syn fin......

    http://blog.chinaunix.net/uid-22312037-id-3575121.html转自 一.TCP报文格式        TCP/IP协议的详细信息参看<TCP/IP协 ...

  2. python内置函数之attr【反射】

    #Auther Bob#--*--conding:utf-8 --*-- #我们来循序渐进的学习反射 import s1 #阶段1# def run():# url = input("请输入 ...

  3. 查找ipa包,删除接的ipa包

  4. 4.n的高精度阶乘---优化

    题目:对于每组测试数据,在一行中给出一非负整数n(n小于等于100) 样例输入 3 5 10 样例输出 6 120 3628800 超时的代码如下:#include <iostream># ...

  5. IDEA 工具下导出文件及文件的目录结构插件

    idea导出增量补丁插件 有时候需要导出IDEA的文件目录结构,即导出  指定修改后的JAVA文件编译后的CLASS .或者是修改过的jsp.配置文件等, 装载此插件,即可以完成导出文件  及文件的目 ...

  6. C#的一些方法读程序转c++

    1.Array.Copypublic static void Copy( Array sourceArray, int sourceIndex, Array destinationArray, int ...

  7. c++11多线程学习笔记之四 生产消费者

    #ifndef MY_QUEUE_H__ #define MY_QUEUE_H__ #include<list> #include<mutex> #include<thr ...

  8. 测试这个才可以打包 我的PYQt matplotlib numpy 等程序

    from distutils.core import setup import py2exe import matplotlib import sys import FileDialog import ...

  9. KBMMW 4.80.00 发布

    一大波更新来了. 4.80.00 March 30 2015 Important notes (changes that may break existing code)        ======= ...

  10. 643. Maximum Average Subarray I

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...