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";
}<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攻击相关推荐
- MVC Html.AntiForgeryToken() 防止CSRF攻击
(一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site requ ...
- 记得ajax中要带上AntiForgeryToken防止CSRF攻击
经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击 在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可. Html.A ...
- CSRF攻击原理及防护
一.CSRF是什么 CSRF全称为跨站请求伪造(Cross-site request forgery),是一种网络攻击方式,也被称为 one-click attack 或者 session ridin ...
- go预防CSRF攻击
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 那么C ...
- csrf攻击ajax,如何在使用ajax post时处理CSRF攻击?
我基本上想做一个ajax post来发送一些stateId并从那个状态中取回一些城市列表.如何在使用ajax post时处理CSRF攻击? @Html.DropDownList("state ...
- laravel token ajax,Laravel中ajax post操作需要传递csrf token的最优化解决方式
在Laravel框架中为了防止csrf攻击,规定只要是post操作都要传递_token值,如果是普通表单那么只要在form中添加@csrf代码就可以了,如果采用ajax方式提交post请求时,最简单的 ...
- ajax校验的优点,django框架中ajax的使用及避开CSRF 验证的方式详解
本文实例讲述了django框架中ajax的使用及避开CSRF 验证的方式.分享给大家供大家参考,具体如下: ajax(Asynchronous Javascript And Xml) 异步javasc ...
- PHP开发中csrf攻击的简单演示和防范
CSRF的全名为Cross-site request forgery,它的中文名为 跨站请求伪造(伪造跨站请求[这样读顺口一点])CSRF是一种夹持用户在已经登陆的web应用程序上执行非本意的操作的攻 ...
- 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击
我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 概述 众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括 ...
最新文章
- 读阿里亿级日活网关通道架构演进有感
- https网站引用http路径的js和css失效解决办法
- 45 个常用Linux 命令,让你轻松玩转Linux!
- NOI.AC#2007-light【根号分治】
- spring security:第一个程序
- wxpython有哪些基本功能_用Python中的wxPython实现最基本的浏览器功能
- 51CTO,博客的显示有问题啊
- 过程日志定位疑难问题
- 吐槽下CSDN编辑器
- Android 阿里云镜像谷歌仓库
- Nested transactions are not supported TransactionScope 多线程事务
- chatter个人理解
- 2548. 大胖子走迷宫 (时间bfs)
- 什么是元学习 (Meta Learning)
- 猜数字小游戏(随机生成’三剑客‘)
- java -g_【JVM】7、深入理解Java G1垃圾收集器
- 服务器 系统打补丁,2019服务器系统打补丁方法
- 图的最小生成树-Kruskal算法
- 绿联外围设备_什么是外围设备(外围设备的类型和列表)?
- 一张图透过结构看世界--掌握结构化思维
热门文章
- OpenGL transformation变换的实例
- OpenGL 平行粒子的实例
- C语言给定数字n阶乘的末尾计算零个数(附完整源码)
- redis的基本使用笔记一
- java什么是对象如何创建对象_java对象的创建过程是什么
- 「C++」C++ Primer Plus 笔记:第三章 处理数据
- 「Python-Bug」错误requests.exceptions.proxyerror: httpsconnectionpool解决方法
- 日期操作类DateUtils
- Java中实现的各种排序算法
- Kettle使用_31 CSV文件输入跳过前几(首)行之过滤记录