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

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

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

我们在ajax post中也带上AntiForgeryToken

@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//也可以将防伪标记放入dataheaders["__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-catchAntiForgery.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//也可以将防伪标记放入dataheaders["__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攻击相关推荐

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

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

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

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

  3. CSRF攻击原理及防护

    一.CSRF是什么 CSRF全称为跨站请求伪造(Cross-site request forgery),是一种网络攻击方式,也被称为 one-click attack 或者 session ridin ...

  4. go预防CSRF攻击

    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 那么C ...

  5. csrf攻击ajax,如何在使用ajax post时处理CSRF攻击?

    我基本上想做一个ajax post来发送一些stateId并从那个状态中取回一些城市列表.如何在使用ajax post时处理CSRF攻击? @Html.DropDownList("state ...

  6. laravel token ajax,Laravel中ajax post操作需要传递csrf token的最优化解决方式

    在Laravel框架中为了防止csrf攻击,规定只要是post操作都要传递_token值,如果是普通表单那么只要在form中添加@csrf代码就可以了,如果采用ajax方式提交post请求时,最简单的 ...

  7. ajax校验的优点,django框架中ajax的使用及避开CSRF 验证的方式详解

    本文实例讲述了django框架中ajax的使用及避开CSRF 验证的方式.分享给大家供大家参考,具体如下: ajax(Asynchronous Javascript And Xml) 异步javasc ...

  8. PHP开发中csrf攻击的简单演示和防范

    CSRF的全名为Cross-site request forgery,它的中文名为 跨站请求伪造(伪造跨站请求[这样读顺口一点])CSRF是一种夹持用户在已经登陆的web应用程序上执行非本意的操作的攻 ...

  9. 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

    我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 概述      众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括 ...

最新文章

  1. 读阿里亿级日活网关通道架构演进有感
  2. https网站引用http路径的js和css失效解决办法
  3. 45 个常用Linux 命令,让你轻松玩转Linux!
  4. NOI.AC#2007-light【根号分治】
  5. spring security:第一个程序
  6. wxpython有哪些基本功能_用Python中的wxPython实现最基本的浏览器功能
  7. 51CTO,博客的显示有问题啊
  8. 过程日志定位疑难问题
  9. 吐槽下CSDN编辑器
  10. Android 阿里云镜像谷歌仓库
  11. Nested transactions are not supported TransactionScope 多线程事务
  12. chatter个人理解
  13. 2548. 大胖子走迷宫 (时间bfs)
  14. 什么是元学习 (Meta Learning)
  15. 猜数字小游戏(随机生成’三剑客‘)
  16. java -g_【JVM】7、深入理解Java G1垃圾收集器
  17. 服务器 系统打补丁,2019服务器系统打补丁方法
  18. 图的最小生成树-Kruskal算法
  19. 绿联外围设备_什么是外围设备(外围设备的类型和列表)?
  20. 一张图透过结构看世界--掌握结构化思维

热门文章

  1. OpenGL transformation变换的实例
  2. OpenGL 平行粒子的实例
  3. C语言给定数字n阶乘的末尾计算零个数(附完整源码)
  4. redis的基本使用笔记一
  5. java什么是对象如何创建对象_java对象的创建过程是什么
  6. 「C++」C++ Primer Plus 笔记:第三章 处理数据
  7. 「Python-Bug」错误requests.exceptions.proxyerror: httpsconnectionpool解决方法
  8. 日期操作类DateUtils
  9. Java中实现的各种排序算法
  10. Kettle使用_31 CSV文件输入跳过前几(首)行之过滤记录