ABP理论之CSRF
返回总目录
本篇目录
- 介绍
- ASP.NET MVC
- ASP.NET WEB API
- ASP.NET Core【以后补上】
- 客户端类库
- 内部原理
介绍
CSRF【Cross-Site Request Forgery】跨站请求伪造是一种攻击类型,一般指的是一个恶意的网站、邮件、博客、即时消息、或程序使得用户的web浏览器对当前用户已认证的可信任网站执行一个自己不愿执行的操作。想要详细了解的可以查看百度CSRF,扩展阅读OWASP。
这里简明描述一下如何在ASP.NET Web API中实现。
ABP框架尽可能地简化并 自动化了CSRF保护,现成的启动模板已经做了预配置。本文,会解释如何将它集成到ASP.NET平台的,以及它是如何工作的。
HTTP动词
无需对GET,HEAD,OPTIONS,TRACEHTTP动词做保护操作,因为正常情况下它们应该是无副作用的(不会更改数据库)。ABP只对POST,PUT,PATCH,DELETE动词实现了反伪造(Anti-Forgery)保护,可以使用本文中定义的特性来更改该行为。
ASP.NET MVC
功能
大家都知道,ASP.NET MVC有自己内置的反伪造系统,但它有一些不足:
- 需要为保护的所有actions添加ValidateAntiForgeryToken特性,这个容易忘记。
- ValidateAntiForgeryToken特性只检查HTML 表单域中的**__RequestVerificationToken,这就使得在AJAX请求中使用它非常困难或不可能,尤其是以"application/json"**作为content-type发送请求时。在Ajax请求中,通常会在请求头中设置token。
- 在JS代码中很难访问验证token,尤其是不在.cshtml文件中写JS。但我们需要在AJax请求中访问使用。
- 即使可以在js中访问token,也需要为每个请求都在头部手动加入,很是麻烦。
ABP做了下面这些事情来客服上面的困难:
- actions会被自动保护(通过AbpAntiForgeryMvcFilter)。自动保护可以应对大多数情况。当然,可以使用DisableAbpAntiForgeryTokenValidation特性为任何action和Controller关闭自动保护,也可以使用 ValidateAbpAntiForgeryToken特性打开。
- 除了HTML的表单域,AbpAntiForgeryMvcFilter也会检查请求头中的token。因此,可以很容易对ajax请求使用反伪造token保护。
- 在js中可以使用abp.security.antiForgery.getToken()函数获得token。
- 为所有的ajax请求头部自动添加反伪造token。
集成
启动模板已经集成了现成的CSRF保护,如果需要手动将它添加到你的项目,那么请参照以下步骤。
Layout 视图
在Layout视图中添加以下代码:
@{SetAntiForgeryCookie();
}
这样,所有使用了这个布局页的页面都会包含这句代码了,该方法定义在ABP视图基类中,它会创建和设置正确的token cookie,使得在js端可以工作。如果有多个Layout的话,需要为每个布局添加上面的代码。
对于ASP.NET MVC 应用,只需要做这么多,所有的ajax请求都会自动工作。但是对于HTML 表单仍然需要使用** @Html.AntiForgeryToken()** HTML帮助方法,因为表单不是通过Ajax提交的,但是不需要在相应的action上使用ValidateAbpAntiForgeryToken 特性了。
配置
XSRF默认是打开的,也可以在模块的PreInitialize方法中关闭或配置,如下:
Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false;
也可以使用Configuration.Modules.AbpWebCommon().AntiForgery对象配置token和cookie名称。
ASP.NET WEB API
功能
ASP.NET Web API不包括反伪造机制,ABP为ASP.NET Web API Controllers提供了基础设施来添加CSRF保护,并且是完全自动化的。
集成
ASP.NET MVC客户端
如果在MVC项目中使用了Web API,那么不需要额外的配置。只要Ajax请求是从一个配置的MVC应用中发出的,即使你的Web API层自宿主在其它进程中,也不需要配置。
其它客户端
如果你的客户端是其它类型的应用(比如,一个独立的angularjs应用,它不能像之前描述的那样使用SetAntiForgeryCookie()方法),那么你应该提供一种设置反伪造token cookie的方法。一种可能的实现方式是像下面那样创建一个api控制器:
using System.Net.Http;
using Abp.Web.Security.AntiForgery;
using Abp.WebApi.Controllers;namespace AngularForgeryDemo.Controllers
{public class AntiForgeryController : AbpApiController{private readonly IAbpAntiForgeryManager _antiForgeryManager;public AntiForgeryController(IAbpAntiForgeryManager antiForgeryManager){_antiForgeryManager = antiForgeryManager;}public HttpResponseMessage GetTokenCookie(){var response = new HttpResponseMessage();_antiForgeryManager.SetCookie(response.Headers);return response;}}
}
然后就可以从客户端调用这个action来设置cookie了。
ASP.NET Core###【以后补上】
客户端类库
jQuery
abp.jquery.js中定义了一个ajax拦截器,它可以将反伪造请求token添加到每个请求的请求头中,它会从abp.security.antiForgery.getToken()函数中获得token。
Angularjs
Angularjs会将反伪造token自动添加到所有的ajax请求中,请点击链接查看Angularjs的XSRF保护一节。ABP默认使用了相同的cookie和header名称。因此,Angularjs集成是现成可用的。
其它类库
如果你使用了其它类库做Ajax请求,那么有三种选择:
Intercept XMLHttpRequest
因为所有的类库都使用了原生的js Ajax对象——XMLHttpRequest,因此可以定义一个简单的拦截器,将token添加到请求头部:
(function (send) {XMLHttpRequest.prototype.send = function (data) {this.setRequestHeader(abp.security.antiForgery.tokenHeaderName, abp.security.antiForgery.getToken());return send.call(this, data);};
})(XMLHttpRequest.prototype.send);
Use Library Interceptor
好的类库都会提供拦截点(比如 jquery和angularjs),因此,请查看文档学习如何拦截请求以及操作头部。
Add the Header Manually
最后,可以使用abp.security.antiForgery.getToken()获取token,然后手动为每个请求添加请求头,但是很可能不需要这么做,而是按照上面的方法解决问题。
内部原理
你可能想知道ABP是如何处理这个的,实际上,ABP使用了和之前文档描述的angularjs机制是一样的。ABP会将token保存到一个cookie中,然后使用那个cookie设置请求头。这个实现也很好地集成到了ASP.NET MVC, Web API 和 Core框架。
ABP理论之CSRF相关推荐
- 进军ABP第一天:ABP理论知识
1.2.3 领域层 领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现. ( 实体(Entity ) 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表. ( 仓储(Rep ...
- ABP框架搭建项目系列教程基础版
我现在要着手一个新的项目,也打算用这个框架,所以想要将我一步一步用这个框架的做项目的步骤和想法跟大家分享出来. 经过前面十二篇的基础教程,现在终于该做个总结了. 第一篇,我们建议新手朋友们先通过ABP ...
- php获取buttonid,asp获取当前id
asp.net中对URL的一些操作 编辑器加载中... 例如当前URI为:http://www.test.com/zzl/renren?id=1 获取绝对URI的路 System.Web.HttpCo ...
- Django从理论到实战(part53)--CSRF攻击
学习笔记,仅供参考,有错必纠 摘自:某网课笔记 文章目录 CSRF攻击 CSRF攻击概述 CSRF攻击原理 防御CSRF攻击 CSRF攻击 CSRF攻击概述 CSRF(Cross Site Reque ...
- ABP官方文档翻译 6.1.1 MVC控制器
ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...
- php csrf攻击 xss区别,用大白话谈谈XSS与CSRF
这两个关键词也是老生常谈了,但是还总是容易让人忘记与搞混~. XSS与CSRF这两个关键词时常被拉出来一起比较(尤其是面试),我在这里也在写一篇扫盲文,也帮自己整理一下知识脉络. 这篇文章会用尽量&q ...
- ABP Framework 研习社经验总结(6.28-7.2)
ABP Framework 研习社经验总结(6.28-7.2) 研习社初衷 在翻译 <实现领域驱动设计>-- 基于 ABP Framework 实现领域驱动设计实用指南 时,因为DDD理论 ...
- 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则
前言 上一篇 基于ABP落地领域驱动设计-01.全景图 概述了DDD理论和对应的解决方案.项目组成.项目引用关系,以及基于ABP落地DDD的通用原则.从这本篇开始,会更加深入地介绍在基于 ABP Fr ...
- [Abp 源码分析]ASP.NET Core 集成
点击上方蓝字关注我们 0. 简介 整个 Abp 框架最为核心的除了 Abp 库之外,其次就是 Abp.AspNetCore 库了.虽然 Abp 本身是可以用于控制台程序的,不过那样的话 Abp 就基本 ...
最新文章
- python标准库介绍——23 UserString 模块详解
- 垃圾回收器机制(三):正确姿势解读GC日志
- Java的知识点31——封装拷贝、封装释放、实现放大器对声音的放大功能
- 优化信息流很麻烦?三招教你轻松搞定
- 什么是单页面应用程序
- 服务器双网卡设置安全_服务器硬件介绍之服务器主板
- java -Date、DateFormat、Calendar类
- js学习(利用websocket监控服务器)
- 定了!苹果 10 亿美元收购英特尔调制解调器部门!
- mysql group by having 子句
- cc2530按键流水灯c语言程序,CC2530流水灯程序
- 基于单片机的智能台灯设计
- HDU 4125 Moles 二叉排序树 树状数组 kmp
- 查看已知WiFi网络的密码
- IOS逆向之汇编基础
- ISCC 2021 SSTI
- 基于Faster-RCNN的目标检测(TF版) 步骤与问题解决办法
- java常用设计模式应用案例
- 基于php的开题报告,基于php的微信web应用开发开题报告.doc
- 【云栖大会】云栖大会盛大召开 已成全球一流科技盛会
热门文章
- 工厂模式 java 电脑配件_1.Java设计模式-工厂模式
- android 代码设置像素,【Android实例】用设计原则来重构1像素保活代码
- plsql初始错误sql.net未正确安装_ANSYS | ansys18.0完整安装过程及常见问题解决方案[图文]...
- asp td tr 高度_ASP.NET Core Blazor 初探之 Blazor Server
- Perl 简单读写XML 文件
- 从0开始的Python学习006流程控制
- 50、多线程创建的三种方式之实现Runnable接口
- github 使用之--ssh配置(及解决ssh_add 报错)
- NYOJ-57 6174问题
- linux(CentOS)下Mrtg的安装詳解