我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ajax中如何使用AntiForgeryToken防止CSRF攻击

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 = "Index";
}
<h3>Index</h3>
<form id="form1">
 <div class="form-horizontal">
  <h5>Persen</h5>
  <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 class="lazy" data-src="~/Scripts/jquery-1.10.2.min.js"></script>
<script class="lazy" data-src="~/Scripts/jquery.validate.min.js"></script>
<script class="lazy" data-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里面的加密字符串

控制器中代码

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中防伪标记在请求

$("#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中的防伪标记

  $(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攻击”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ajax中如何使用AntiForgeryToken防止CSRF攻击

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

WEB安全入门:如何防止 CSRF 攻击?

现在,我们绝大多数人都会在网上购物买东西。但是很多人都不清楚的是,很多电商网站会存在安全漏洞。乌云就通报过,国内很多家公司的网站都存在 CSRF 漏洞。如果某个网站存在这种安全漏洞的话,那么我们在购物的过程中,就很可能会被网络黑客盗刷信用卡。是不是瞬间有点「不
WEB安全入门:如何防止 CSRF 攻击?
2018-07-02

如何防止 PHP 函数受到 CSRF 攻击?

摘要:php 函数中的 csrf 攻击可通过使用令牌防御:生成唯一令牌并存储在会话或 cookie 中。将令牌包含在受保护表单中作为隐藏字段。处理表单提交时,验证令牌是否与存储的令牌匹配。不匹配则拒绝请求。如何防御 PHP 函数中的 CSR
如何防止 PHP 函数受到 CSRF 攻击?
2024-05-01

PHP 框架安全指南:如何防止 CSRF 攻击?

PHP 框架安全指南:如何防止 CSRF 攻击?跨站点请求伪造 (CSRF) 攻击是一种网络攻击,其中攻击者诱骗用户在受害者的网络应用程序中执行非预期操作。CSRF 如何工作?CSRF 攻击利用了一个事实:大多数 Web 应用程序允许
PHP 框架安全指南:如何防止 CSRF 攻击?
2024-05-23

如何用手动防止Ping攻击

本篇内容介绍了“如何用手动防止Ping攻击”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ping命令是大家用的较多的DOS命令。大家知道,p
2023-06-14

你如何在Linux中防止SYN Flood攻击

这篇文章给大家介绍你如何在Linux中防止SYN Flood攻击,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。SYN泛洪攻击(SYN Flood)是指使用不完善的TCP/IP三次握手,恶意发送大量只包含SYN握手序列的
2023-06-05

SSL证书如何防止中间人攻击

SSL证书通过使用加密技术来确保通信过程中的数据传输安全。SSL证书中包含了公钥和私钥,公钥用于加密数据,私钥用于解密数据。当客户端和服务器建立连接时,服务器会将其SSL证书发送给客户端,客户端通过验证证书的合法性来确认连接的安全性。中间
SSL证书如何防止中间人攻击
2024-04-17

PHP中如何使用预处理语句防止SQL注入攻击?

php 中使用预处理语句可以有效防御 sql 注入攻击。预处理语句通过允许在执行查询之前定义查询参数,从而阻止攻击者插入恶意字符串。它具有更高的安全性、更好的性能和易于使用的优点。PHP中使用预处理语句抵御SQL注入攻击什么是SQL注入攻
PHP中如何使用预处理语句防止SQL注入攻击?
2024-05-06

如何使用阿里云服务器来防止流量攻击

阿里云服务器的安全问题一直是用户最为关注的问题之一,尤其是在网络攻击频发的今天,如何防止流量攻击成为了许多用户必须面对的问题。本文将为您介绍如何使用阿里云服务器来防止流量攻击。随着互联网的发展,网络攻击越来越普遍。其中最常见的攻击类型之一就是流量攻击,即攻击者通过向服务器发送大量请求来消耗其带宽,从而导致服务器无
如何使用阿里云服务器来防止流量攻击
2023-12-30

香港服务器租用如何防止被攻击

要防止香港服务器租用被攻击,可以采取以下措施:更新操作系统和软件:定期更新服务器的操作系统和软件,确保系统中的漏洞得到及时修复。安装防火墙:配置防火墙来监控和过滤流量,阻止非法访问和攻击。使用强密码:确保服务器和相关账户的密码足够强大,包括
香港服务器租用如何防止被攻击
2024-04-10

租用日本服务器如何防止恶意攻击

租用日本服务器时,可以采取以下措施来防止恶意攻击:安装防火墙:配置防火墙来监控和限制网络流量,以阻止恶意攻击者的入侵尝试。更新系统和应用程序:定期更新操作系统和软件程序,确保系统不受已知漏洞的威胁。使用强密码:使用复杂和独特的密码来保护
租用日本服务器如何防止恶意攻击
2024-04-09

编程热搜

目录