ASP.NET MVC Ajax 伪造请求

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);

            }
        }
    }

原文地址:https://www.cnblogs.com/xiaobai123/p/9254847.html

时间: 2024-12-28 23:17:11

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

ASP.NET MVC AJAX调用JsonResult方法并返回自定义错误信息

一.如何用AJAX调用JsonResult方法 比如FuckController中添加有个返回JsonResult类型的方法FuckJson(): public JsonResult FuckJson() { return new JsonResult() { Data = new List<string>() { "fuck", "shit" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }

ASP.NET MVC ajax提交 防止CSRF攻击

//在View中 <script type="text/javascript"> @functions{ public string ToKenHeaderValue() { string cookieToken,fromToken; AntiForgery.GetTokens(null,out cookieToken,out fromToken); return cookieToken+":"+fromToken; }} $function({ ...

asp.net mvc ajax.beginform()无法上传文件

Asp.Net Mvc使用Ajax.BeginForm上传文件Request.Files始终为null. 使用jquery.form.js插件能解决问题.asp.net mvc ajax.beginform()无法上传文件

ASP.NET MVC ajax处理 AjaxResult

1.统一ASPNET MVC 对ajax请求响应格式定义,方便前端统一处理ajax结果. 1)定义程序返回结果数据格式 1 /// <summary> 2 /// 执行结果 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 public class RunResult<T> 6 { 7 /// <summary> 8 /// 操作状态 9 /// &

Asp.Net MVC Ajax

将ASP.NET MVC中的form提交改为ajax提交 在ASP.NET MVC视图中通过 @using (Html.BeginForm()) 产生的是form表单提交代码,可以用javascript代码截获这个form提交,改为ajax提交,示例代码如下: 代码来自:http://www.cnblogs.com/dudu/archive/2011/12/07/asp_net_mvc_form_ajax.html $('#form1').submit(function () {    if (

ASP.NET MVC Ajax.ActionLink 简单用法

ASP.NET MVC 项目中,如何使用类似于 iframe 的效果呢?或者说 Ajax 局部刷新,比如下面操作: 我们想要的效果是,点击 About 链接,页面不刷新(地址栏不变),然后下面的内容进行更新,其实实现这个效果,很简单,只需要使用 Ajax.ActionLink 即可. 1. 安装 Microsoft.jQuery.Unobtrusive.Ajax 程序包 Install-Package Microsoft.jQuery.Unobtrusive.Ajax 2. 引用 JS 文件:

取经——ASP.NET MVC Ajax

一直对ASP.NET MVC 的异步提交搞不懂,今天决定一探究竟. 其实核心都封装在jquery.unobtrusive-ajax.js里. 我们发现所有的代码都放在了(function($){}(jQuery))里,这个结构很奇妙,一般的js函数都是function(){},可这个后面多了个参数,其实说白了这是个匿名方法,我们一点点还原它的真实面目. 我们可以写成这样(function($){})(jQuery), 我们再把function方法拿出来 function aa($){ } aa(

asp .net mvc ajax 传值到后台,并放回JSon值解析

什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 有很多使用 AJAX 的应用程序案例:新浪微博.Google 地图.开心网等等. AJAX定义个用法参考http://www.w3school.com.cn/jquer

Asp.net Mvc Ajax.BeginForm提交表单

之前Mvc中一直用Html.BeginForm提交表单,即如下: @using (Html.BeginForm("Add", "News", FormMethod.Post, new { enctype = "multipart/form-data" })) { <table> <tr> <td><span style="color:red">*</span><