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);
- }
- }
- }
ASP.NET MVC Ajax 伪造请求的更多相关文章
- ASP.NET MVC AJAX 请求中加入 antiforgerytoken 解决“所需的防伪表单字段“__RequestVerificationToken”不存在”问题
在ASP.NET mvc中如果在表中使用了@Html.AntiForgeryToken(),ajax post不会请求成功 解决方法是在ajax中加入__RequestVerificationToke ...
- ASP.NET MVC ajax处理 AjaxResult
1.统一ASPNET MVC 对ajax请求响应格式定义,方便前端统一处理ajax结果. 1)定义程序返回结果数据格式 /// <summary> /// 执行结果 /// </su ...
- ASP.NET MVC Ajax.ActionLink 简单用法
ASP.NET MVC 项目中,如何使用类似于 iframe 的效果呢?或者说 Ajax 局部刷新,比如下面操作: 我们想要的效果是,点击 About 链接,页面不刷新(地址栏不变),然后下面的内容进 ...
- Asp.Net MVC ajax调用 .net 类库问题
如果你还在为 ajax 调用 .net 类库还束手无策的话,相信这篇博客将帮助你解决这个世纪问题! 因为Visual Studio 内置了asp.net mvc ,不过当你添加asp.net mvc项 ...
- Asp.Net MVC Ajax
将ASP.NET MVC中的form提交改为ajax提交 在ASP.NET MVC视图中通过 @using (Html.BeginForm()) 产生的是form表单提交代码,可以用javascrip ...
- 详解ASP.NET MVC应用程序请求生命周期
------转载当一个ASP.NET MVC应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在ASP.NET MVC应用程序Http request 和Http response 过程中, ...
- asp.net MVC ajax 请求参数前台加密后台解密
最近有一个需求要求页面查询数据库,查询内容保存到excel里面作为附件加密打包下载.查询的sql作为参数传入后台,实现加密提交.这里做个记录,后面用到直接来拿. 控制器 public ActionRe ...
- ASP.NET MVC AJAX的调用示例
@{ ViewBag.Title = "Home Page"; //下面引用Jquery和unobtrusive-ajax } @Scripts.Render("~/bu ...
- asp.net mvc ajax FileUpload
//后台代码 [HttpPost] public ActionResult CreateCategory(HttpPostedFileBase file) { string url = Upload( ...
随机推荐
- 转---tcp三次握手四次挥手syn fin......
http://blog.chinaunix.net/uid-22312037-id-3575121.html转自 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协 ...
- python内置函数之attr【反射】
#Auther Bob#--*--conding:utf-8 --*-- #我们来循序渐进的学习反射 import s1 #阶段1# def run():# url = input("请输入 ...
- 查找ipa包,删除接的ipa包
- 4.n的高精度阶乘---优化
题目:对于每组测试数据,在一行中给出一非负整数n(n小于等于100) 样例输入 3 5 10 样例输出 6 120 3628800 超时的代码如下:#include <iostream># ...
- IDEA 工具下导出文件及文件的目录结构插件
idea导出增量补丁插件 有时候需要导出IDEA的文件目录结构,即导出 指定修改后的JAVA文件编译后的CLASS .或者是修改过的jsp.配置文件等, 装载此插件,即可以完成导出文件 及文件的目 ...
- C#的一些方法读程序转c++
1.Array.Copypublic static void Copy( Array sourceArray, int sourceIndex, Array destinationArray, int ...
- c++11多线程学习笔记之四 生产消费者
#ifndef MY_QUEUE_H__ #define MY_QUEUE_H__ #include<list> #include<mutex> #include<thr ...
- 测试这个才可以打包 我的PYQt matplotlib numpy 等程序
from distutils.core import setup import py2exe import matplotlib import sys import FileDialog import ...
- KBMMW 4.80.00 发布
一大波更新来了. 4.80.00 March 30 2015 Important notes (changes that may break existing code) ======= ...
- 643. Maximum Average Subarray I
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...