1.前言

CSRF(Cross-site request forgery)跨站请求伪造,ASP.NET MVC 应用通过使用AJAX请求来提升用户体验,浏览器开发者工具可以一览众山小,就很容易伪造了请求对应用进行攻击,从而泄露核心数据,导致安全问题。微软自带AntiForgeryToken可以解决,而且语法简单(AJAX请求发起时传递给后台一个字符串,然后在Filter中进行校验)

2.场景如下

为了验证一个来自form post请求,还需要在目标action上增加自定义[AntiForgeryToken]特性,下面会介绍到这个自定义特性用法

    /// <summary>
/// 首页
/// </summary>
public class HomeController : Controller
{ /// <summary>
/// 用户登录了111111
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
return View();
} /// <summary>
/// Your application description page.
/// </summary>
/// <returns></returns>
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
} /// <summary>
/// Your contact page.
/// </summary>
/// <param name="name">姓名</param>
/// <returns></returns>
public ActionResult Contact(string name)
{
ViewBag.Message = "Your contact page.";
return View();
} /// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Person()
{
return View();
} /// <summary>
///
/// </summary>
/// <param name="Name"></param>
/// <param name="Age"></param>
/// <returns></returns>
[HttpPost]
[AntiForgeryToken]
public ActionResult UserInfo(string Name,string Age)
{
return Json(Name + Age);
} }

前端html中如何防范?

一句语法糖解决所有问题,通过在html页面上或者script中使用 Html.AntiForgeryToken(),然后赋值给ajax中headers

html页面上

1.html中使用@Html.AntiForgeryToken(),然后通过jquery中name,获取隐藏域value的值,再赋值给ajax中headers

2.var headToken=$('input[name="__RequestVerificationToken"]').val();

script中

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Person</title>
<script src="~/Scripts/jquery-3.3.1.min.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
</head>
<body>
<form id="form1">
    @*@Html.AntiForgeryToken()*@
<div class="form-horizontal">
<div class="form-group">
<div>
姓名:<input type="text" name="name" value="" id="name" />
密码: <input type="text" name="age" value="" id="age" />
</div> <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>
$(function () { //获取防伪标记
var token = $('@Html.AntiForgeryToken()').val();
var headers = {};
//防伪标记放入headers
//也可以将防伪标记放入data
headers["__RequestVerificationToken"] = token;
$("#save").click(function () {
$.ajax({
type: 'POST',
url: '/Home/UserInfo',
cache: false,
headers: headers,
data: { Name: $("#name").val(), Age: $("#age").val() },
success: function (data) {
alert(data)
},
error: function () {
alert("Error")
}
});
}) });
</script>
</body>
</html>

3.自定义AuthorizeAttribute属性

它主要检查

(1)请求的是否包含一个约定的AntiForgery名的cookie

(2)请求Headers是否有一个["__RequestVerificationToken"],并且不能为空,约定的AntiForgery名的cookie和Headers中的值是否匹配

public class AntiForgeryToken : AuthorizeAttribute
{
/// <summary>
///
/// </summary>
/// <param name="filterContext"></param>
public override void OnAuthorization(AuthorizationContext filterContext)
{ var request = filterContext.HttpContext.Request; if (request.IsAjaxRequest())
{
var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName]; var cookieValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null;
var headerValue = request.Headers["__RequestVerificationToken"];
//获取head中的值 如果为空直接拒绝不往下走
if (string.IsNullOrEmpty(headerValue))
{
base.OnAuthorization(filterContext);
return;
} //从cookies 和 Headers 中 验证防伪标记
AntiForgery.Validate(cookieValue,headerValue); }
}
}

ASP.NET MVC Ajax 伪造请求的更多相关文章

  1. ASP.NET MVC AJAX 请求中加入 antiforgerytoken 解决“所需的防伪表单字段“__RequestVerificationToken”不存在”问题

    在ASP.NET mvc中如果在表中使用了@Html.AntiForgeryToken(),ajax post不会请求成功 解决方法是在ajax中加入__RequestVerificationToke ...

  2. ASP.NET MVC ajax处理 AjaxResult

    1.统一ASPNET MVC 对ajax请求响应格式定义,方便前端统一处理ajax结果. 1)定义程序返回结果数据格式 /// <summary> /// 执行结果 /// </su ...

  3. ASP.NET MVC Ajax.ActionLink 简单用法

    ASP.NET MVC 项目中,如何使用类似于 iframe 的效果呢?或者说 Ajax 局部刷新,比如下面操作: 我们想要的效果是,点击 About 链接,页面不刷新(地址栏不变),然后下面的内容进 ...

  4. Asp.Net MVC ajax调用 .net 类库问题

    如果你还在为 ajax 调用 .net 类库还束手无策的话,相信这篇博客将帮助你解决这个世纪问题! 因为Visual Studio 内置了asp.net mvc ,不过当你添加asp.net mvc项 ...

  5. Asp.Net MVC Ajax

    将ASP.NET MVC中的form提交改为ajax提交 在ASP.NET MVC视图中通过 @using (Html.BeginForm()) 产生的是form表单提交代码,可以用javascrip ...

  6. 详解ASP.NET MVC应用程序请求生命周期

    ------转载当一个ASP.NET MVC应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在ASP.NET MVC应用程序Http request 和Http response 过程中, ...

  7. asp.net MVC ajax 请求参数前台加密后台解密

    最近有一个需求要求页面查询数据库,查询内容保存到excel里面作为附件加密打包下载.查询的sql作为参数传入后台,实现加密提交.这里做个记录,后面用到直接来拿. 控制器 public ActionRe ...

  8. ASP.NET MVC AJAX的调用示例

    @{ ViewBag.Title = "Home Page"; //下面引用Jquery和unobtrusive-ajax } @Scripts.Render("~/bu ...

  9. asp.net mvc ajax FileUpload

    //后台代码 [HttpPost] public ActionResult CreateCategory(HttpPostedFileBase file) { string url = Upload( ...

随机推荐

  1. AspectJ的XML方式完成AOP的开发之AOP的通知类型

    1. 前置通知 * 在目标类的方法执行之前执行. * 配置文件信息:<aop:after method="before" pointcut-ref="myPoint ...

  2. samba配置(z)

    http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.html

  3. tp5.1注册路由后接收不到参数

  4. glog日志

    google 开源日志库 #include <glog/logging.h> yum install glog

  5. axios 设置拦截器 全局设置带默认参数(发送 token 等)

    应用场景: 1,每个请求都带上的参数,比如token,时间戳等. 2,对返回的状态进行判断,比如token是否过期 代码如下: [javascript] view plain copy axios.i ...

  6. Git 初始状操作指引

    You have an empty repository To get started you will need to run these commands in your terminal. Ne ...

  7. easyui datagrid 分页 客户分页

    1.写好json 数据 {                                                              "total":21,     ...

  8. mybatis后台中传参到sql语句中,使用@Param注解

  9. java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java he

    tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError:) 最简单的解决办法: 在ecl ...

  10. UVa 10269 Adventure of Super Mario (Floyd + DP + BFS)

    题意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用,但在 ...