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

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

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

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

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

我们在ajax post中也带上AntiForgeryToken

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

@model WebApplication1.Controllers.Person

@{

 ViewBag.Title = "Index";

}

<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 src="~/Scripts/jquery-1.10.2.min.js"></script>

<script src="~/Scripts/jquery.validate.min.js"></script>

<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

<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: "yangwen", Age: "1" },

    success: function (data) {

     alert(data)

    },

    error: function () {

     alert("Error")

    }

   });

  })

 })

</script>

放在cookies里面的加密字符串

控制器中代码

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Web;

using System.Web.Helpers;

using System.Web.Mvc;

namespace WebApplication1.Controllers

 {

 public class HomeController : Controller

  {

  public ActionResult Index()

   {

   return View();

   }

  [HttpPost]

  [MyValidateAntiForgeryToken]

  public ActionResult Index(Person p)

   {

   return Json(true, JsonRequestBehavior.AllowGet);

   }

  }

 public class Person

  {

  public string Name { get; set; }

  public int Age { get; set; }

  }

 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);

     }

    }

   }

  }

 }

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

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

$("#save").click(function () {

 $.ajax({

  type: ‘POST‘,

  url: ‘/Home/Index‘,

  cache: false,

 //  headers: headers,

  data: { Name: "yangwen", Age: "1" },

  success: function (data) {

   alert(data)

  },

  error: function () {

   alert("Error")

  }

 });

})

默认返回500的状态码。

这里修改ajax中的防伪标记

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

  $(function () {

 //var token = $(‘[name=__RequestVerificationToken]‘);

 //获取防伪标记

 var token = $(‘@Html.AntiForgeryToken()‘).val();

 var headers = {};

 //防伪标记放入headers

 //也可以将防伪标记放入data

 headers["__RequestVerificationToken"] = token+11111111111111111111111111111111111;

 $("#save").click(function () {

  $.ajax({

   type: ‘POST‘,

   url: ‘/Home/Index‘,

   cache: false,

    headers: headers,

   data: { Name: "yangwen", Age: "1" },

   success: function (data) {

    alert(data)

   },

   error: function () {

    alert("Error")

   }

  });

 })

})

也是500的状态码。

以上内容就是本文的全部叙述,切记ajax中要带上AntiForgeryToken防止CSRF攻击,小伙伴们在使用过程发现有疑问,请给我留言,谢谢!

时间: 2024-11-25 19:29:47

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

记得ajax中要带上AntiForgeryToken防止CSRF攻击

经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击 在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可. Html.AntiForgeryToken()会生成一对加密的字符串,分别存放在Cookies 和 input 中. 我们在ajax post中也带上AntiForgeryToken @model WebApplication1.Controllers.Person @{ ViewBag.Title = "In

ajax中加上AntiForgeryToken防止CSRF攻击

经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击 在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可. Html.AntiForgeryToken()会生成一对加密的字符串,分别存放在Cookies 和 input 中. 我们在ajax post中也带上AntiForgeryToken @model WebApplication1.Controllers.Person @{ ViewBag.Title = "In

MVC Html.AntiForgeryToken() 防止CSRF攻击

http://blog.csdn.net/cpytiger/article/details/8781457 (一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cross-Site-Script),攻击不同,XSS一般是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击,而CSR

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

[转]MVC Html.AntiForgeryToken() 防止CSRF攻击 本文转自:http://blog.csdn.net/luck901229/article/details/8261640 一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 二.CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你

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

有关Html.AntiForgeryToken()的使用其实网上的说明很多了,比如http://blog.csdn.net/cpytiger/article/details/8781457 那么我们写的AJAX调用怎么办了,难道需要修改所有的ajax请求数据吗?我个人比较懒惰喜欢写一个通用的代码.其实原理很简单就是拦截ajax请求,然后追加自己的数据.注意在ajax传输数据的时候可以是String/object,所以这里需要处理一下: if (typeof data !== "string&qu

在SpringMVC中使用拦截器(interceptor)拦截CSRF攻击

关于什么是CSRF我这里就不多说了,以前转载的一篇文章(PS:https://www.zifangsky.cn/358.html)已经说得很清楚了.这里只是简单介绍如何在SpringMVC中使用拦截器拦截CSRF攻击.具体代码如下: (1)登录页面: <%@page import="java.security.SecureRandom"%> <%@ page language="java" contentType="text/html; 

Django 如何让ajax的POST方法带上CSRF令牌

大家知道,在大前端领域,有一种叫做ajax的东东,即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),它被用来在不刷新页面的情况下,提交和请求数据.如果Django服务器接收的是一个通过ajax发送过来的POST请求的话,那么将很麻烦.何也?因为在ajax中,没有办法像form表单中那样携带{% csrf_token %}令牌.那怎么办呢?好办!在你的前端模版的JavaScript代码处,添加下面的代码: // 使用jQuer

在 PHP 中结合 Ajax 技术进行图片上传

前面几则日志中讲述了在 PHP 中上传文件,相信大家对 PHP 中如何进行文件上传已经初步掌握.本文来继续探讨在 PHP 中上传文件的技术,不同的是,本次上传将仅限于图片文件的上传,并且将采用 Ajax 技术. 本例将要实现这样的效果:当用户选择图片,开始上传后,后台上传完成时,随即会显示到当前页面.由于,从开始上传到上传完成,再到图片显示均在一个页面上 完成(从表面上看).所以使用 Ajax 技术是必须的.但如何使用这些操作在一个页面上来完成呢?考虑到这样的情况,当文件开始上传后,便开始打开

Ajax的底层实现--使用Ajax实现无刷新登录实例--解决ajax中URl参数带中文的乱码问题

  1.jsp代码 第一部分(html代码):前端页面 <div id="login"> 用户名: <input type="text" id="userName"/> <!--用户名--> 密码: <input type="password" id="psw"/> <!--密码--> <input type="submit&quo