91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-09-14 17:23:23 來源:億速云 閱讀:106 作者:小新 欄目:web開發

小編給大家分享一下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 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里面的加密字符串

控制器中代碼

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攻擊”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北海市| 枣庄市| 信丰县| 九寨沟县| 七台河市| 蓬莱市| 山东省| 潢川县| 林周县| 阳朔县| 湘乡市| 慈溪市| 河曲县| 贵德县| 治县。| 泗洪县| 高州市| 栖霞市| 蕉岭县| 北川| 金溪县| 延边| 淮南市| 江北区| 沅陵县| 廉江市| 江陵县| 金川县| 大关县| 沁水县| 辽宁省| 微山县| 宜都市| 济宁市| 泌阳县| 南安市| 繁昌县| 胶南市| 鄂温| 沙坪坝区| 金门县|