经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击

在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可。

Html.AntiForgeryToken()会生成一对加密的字符串,分别存放在Cookies 和 input 中。

我们在ajax post中也带上AntiForgeryToken

  1. @model WebApplication1.Controllers.Person
  2. @{
  3. ViewBag.Title = "Index";
  4. }
  5.  
  6. <h2>Index</h2>
  7. <form id="form1">
  8. <div class="form-horizontal">
  9. <h4>Persen</h4>
  10. <hr />
  11. @Html.ValidationSummary(true, "", new { @class = "text-danger" })
  12. <div class="form-group">
  13. @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
  14. <div class="col-md-10">
  15. @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
  16. @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
  17. </div>
  18. </div>
  19. <div class="form-group">
  20. @Html.LabelFor(model => model.Age, htmlAttributes: new { @class = "control-label col-md-2" })
  21. <div class="col-md-10">
  22. @Html.EditorFor(model => model.Age, new { htmlAttributes = new { @class = "form-control" } })
  23. @Html.ValidationMessageFor(model => model.Age, "", new { @class = "text-danger" })
  24. </div>
  25. </div>
  26. <div class="form-group">
  27. <div class="col-md-offset-2 col-md-10">
  28. <input type="button" id="save" value="Create" class="btn btn-default" />
  29. </div>
  30. </div>
  31. </div>
  32.  
  33. </form>
  34. <script src="~/Scripts/jquery-1.10.2.min.js"></script>
  35. <script src="~/Scripts/jquery.validate.min.js"></script>
  36. <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
  37. <script type="text/javascript">
  38. $(function () {
  39.  
  40. //var token = $('[name=__RequestVerificationToken]');
  41. //获取防伪标记
  42. var token = $('@Html.AntiForgeryToken()').val();
  43. var headers = {};
  44. //防伪标记放入headers
  45. //也可以将防伪标记放入data
  46. headers["__RequestVerificationToken"] = token;
  47.  
  48. $("#save").click(function () {
  49. $.ajax({
  50. type: 'POST',
  51. url: '/Home/Index',
  52. cache: false,
  53. headers: headers,
  54. data: { Name: "yangwen", Age: "1" },
  55. success: function (data) {
  56. alert(data)
  57. },
  58. error: function () {
  59. alert("Error")
  60. }
  61. });
  62. })
  63.  
  64. })
  65. </script>

放在cookies里面的加密字符串

控制器中代码


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Web;
  6. using System.Web.Helpers;
  7. using System.Web.Mvc;
  8.  
  9. namespace WebApplication1.Controllers
  10. {
  11. public class HomeController : Controller
  12. {
  13. public ActionResult Index()
  14. {
  15.  
  16. return View();
  17. }
  18. [HttpPost]
  19. [MyValidateAntiForgeryToken]
  20. public ActionResult Index(Person p)
  21. {
  22. return Json(true, JsonRequestBehavior.AllowGet);
  23. }
  24. }
  25. public class Person
  26. {
  27. public string Name { get; set; }
  28.  
  29. public int Age { get; set; }
  30. }
  31.  
  32. public class MyValidateAntiForgeryToken : AuthorizeAttribute
  33. {
  34. public override void OnAuthorization(AuthorizationContext filterContext)
  35. {
  36. var request = filterContext.HttpContext.Request;
  37.  
  38. if (request.HttpMethod == WebRequestMethods.Http.Post)
  39. {
  40. if (request.IsAjaxRequest())
  41. {
  42. var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
  43.  
  44. var cookieValue = antiForgeryCookie != null
  45. ? antiForgeryCookie.Value
  46. : null;
  47. //从cookies 和 Headers 中 验证防伪标记
  48. //这里可以加try-catch
  49. AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]);
  50. }
  51. else
  52. {
  53. new ValidateAntiForgeryTokenAttribute()
  54. .OnAuthorization(filterContext);
  55. }
  56. }
  57. }
  58. }
  59.  
  60. }

这里注释掉ajax中防伪标记在请求

  1. $("#save").click(function () {
  2. $.ajax({
  3. type: 'POST',
  4. url: '/Home/Index',
  5. cache: false,
  6. // headers: headers,
  7. data: { Name: "yangwen", Age: "" },
  8. success: function (data) {
  9. alert(data)
  10. },
  11. error: function () {
  12. alert("Error")
  13. }
  14. });
  15. })

默认返回500的状态码。

这里修改ajax中的防伪标记

  1. $(function () {
  2.  
  3. //var token = $('[name=__RequestVerificationToken]');
  4. //获取防伪标记
  5. var token = $('@Html.AntiForgeryToken()').val();
  6. var headers = {};
  7. //防伪标记放入headers
  8. //也可以将防伪标记放入data
  9. headers["__RequestVerificationToken"] = token+;
  10. $("#save").click(function () {
  11. $.ajax({
  12. type: 'POST',
  13. url: '/Home/Index',
  14. cache: false,
  15. headers: headers,
  16. data: { Name: "yangwen", Age: "" },
  17. success: function (data) {
  18. alert(data)
  19. },
  20. error: function () {
  21. alert("Error")
  22. }
  23. });
  24. })
  25.  
  26. })

也是500的状态码。

记得ajax中要带上AntiForgeryToken防止CSRF攻击的更多相关文章

  1. 切记ajax中要带上AntiForgeryToken防止CSRF攻击

    在程序项目中经常看到ajax post数据到服务器没有加上防伪标记,导致CSRF被攻击,下面小编通过本篇文章给大家介绍ajax中要带上AntiForgeryToken防止CSRF攻击,感兴趣的朋友一起 ...

  2. ajax中加上AntiForgeryToken防止CSRF攻击

    经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击 在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可. Html.A ...

  3. 转:MVC Html.AntiForgeryToken() 防止CSRF攻击

    (一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site requ ...

  4. MVC Html.AntiForgeryToken() 防止CSRF攻击 - CSDN博客

    原文:MVC Html.AntiForgeryToken() 防止CSRF攻击 - CSDN博客 (一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.A ...

  5. [ASP.NET MVC]@Html.AntiForgeryToken() 防止CSRF攻击

    MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request ...

  6. [转]MVC Html.AntiForgeryToken() 防止CSRF攻击

    [转]MVC Html.AntiForgeryToken() 防止CSRF攻击 本文转自:http://blog.csdn.net/luck901229/article/details/8261640 ...

  7. MVC Html.AntiForgeryToken() 防止CSRF攻击

    转自:http://blog.csdn.net/cpytiger/article/details/8781457 一.MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(C ...

  8. Html.AntiForgeryToken() 防止CSRF攻击 的AJaX应用

    有关Html.AntiForgeryToken()的使用其实网上的说明很多了,比如http://blog.csdn.net/cpytiger/article/details/8781457 那么我们写 ...

  9. 转载MVC Html.AntiForgeryToken() 防止CSRF攻击

    MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cross ...

随机推荐

  1. play项目部署

    首先对于现场的数据库,一定要谨慎谨慎再谨慎,特别是保存有重要数据的. 使用expdp命令导入数据库: 事前准备: 1.确保linux服务器上已经正确安装oracle (10g以上版本) 2.有Xshe ...

  2. UIBarButtonItem变弹簧

    UIBarButtonItem * spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystem ...

  3. PostgreSQL trigger (function) examples

    postgres=# \c warehouse_db You are now connected to database "warehouse_db" as user " ...

  4. java 获取当前系统系时间

    //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 SimpleDateFo ...

  5. ACM之Java速成(4)

    ACM中Java.进制转换 Java进制转换: 由于Unicode兼容ASCII(0-255),因此,上面得到的Unicode就是ASCII. java中进行二进制,八进制,十六进制,十进制间进行相互 ...

  6. 利用MyEclipes的反转工程来配置Hibernate各种配置

    首先需要有设计好的数据库,然后创建一个Web Project然后右键点击项目选择MyEclipse→add Hibernate Capabilities →→ →→,然后如果没有管理员的话需要在选择M ...

  7. ACdream 1157 Segments(CDQ分治)

    题目链接:http://acdream.info/problem?pid=1157 Problem Description 由3钟类型操作:1)D L R(1 <= L <= R < ...

  8. ./fedora_install_oracle.sh bad interpreter

    错误原因之一很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC ...

  9. paper 10:支持向量机系列七:Kernel II —— 核方法的一些理论补充,关于 Reproducing Kernel Hilbert Space 和 Representer Theorem 的简介。

    在之前我们介绍了如何用 Kernel 方法来将线性 SVM 进行推广以使其能够处理非线性的情况,那里用到的方法就是通过一个非线性映射 ϕ(⋅) 将原始数据进行映射,使得原来的非线性问题在映射之后的空间 ...

  10. archlinux锁屏

    启动管理器用的是 slim 发现锁屏可以用 slimlock