ABP官方文档翻译 6.7 CSRF/XSRF保护
CSRF/XSRF保护
介绍
"跨站请求伪造(CSRF)是网络攻击的一种类型,当一个恶意的网站、email、博客、即时通讯或程序导致用户的浏览器在一个用户授权的网站上执行了一个不需要的action时发生"(OWASP)。
在这里也有简单的介绍解释了如何在ASP.NET Web API上实现这种攻击。
ABP框架简化并自动防范CSRF攻击。启动模板里包含相关的预配置。在本文档中,将解释保护机制是如何集成到ABP平台及如何工作的。
HTTP动词
GET,HEAD,OPTIONS和TRACE这几个 HTTP动词不需要保护,因为通常他们是没有副作用的(不改变数据库)。ABP只为POST、PUT、PATCH和DELETE动词实现了自动伪造保护,你可以使用在本文档中定义的特性来改变这种行为。
非浏览器客户端
CSRF是一种因为浏览器的问题造成的攻击类型。因为浏览器为所有的请求发送所有的cookieds(包含授权的cookies),包含跨域请求。但是,非浏览器客户端不存在这个问题,如移动应用。ABP框架可以分辨不同的客户端,自动为非浏览器客户端跳过防伪造校验。
ASP.NET MVC
特征
ASP.NET MVC有自己內建的防伪造系统。但是它有一些弱点:
- 需要给所有需要保护的actions添加ValidateAntiForgeryToken特性。我们有可能忘记给所有需要的actions添加这个特性。
- 在HTML表单字段中, ValidateAntiForgeryToken特性只检查_RequestVerificationToken。这样就很难或不可能在AJAX请求中使用,尤其是当content-type类型为"application/json"时。在AJAX请求中,通常会在请求报头中设置token。
- 在javascript代码中很难验证token(尤其是如果你编写的javascript代码没有在.cshtml文件中).我们需要使用AJAX请求访问它。
- 即使我们能够在javascript中访问token,我们需要在每次请求的报头中添加它。
ABP采取了下面的措施来克服这些困难:
- 不再需要为POST、PUT、PATCH和DELETE actions添加ValidateAntiFogeryTokey特性,因为他们是自动保护的(通过AbpAntiForgeryMvcFilter)。自动保护足以应付大多数情况。但是,你可以使用DisableAbpAniForgeryTokeyValidation特性来为action或controller禁用它,也可以使用ValidateAbpAntiForgeryTokey特性为特定的action/controller启用它。
- 除了HTML表单字段,AbpAntiForgeryMvcFilter也检查报头中的token。因此,我们可以很容易的在AJAX请求中使用防伪造token保护。
- 提供abp.security.antiForgery.getToken()方法来在javascript中获取token,即使你并不需要它。
- 自动为所有的AJAX请求报头添加方伪造token。
因此,它几乎无缝的工作。
集成
启动模板已经集成了CSRF保护。如果你需要手动在工程中添加(可能你的工程是在我们添加它之前创建的),跟随这个向导。
布局视图
我们需要在Layout视图中添加下面的代码:
@{
SetAntiForgeryCookie();
}
因此,所有包含他的页都会使用这个布局。这个方法定义在ABP基础视图类中。它创建、设置合适的token cookies,使javascript可以实现这个功能。如果你有多个布局,那么每个布局都需要添加这段代码。
对于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控制器自动添加CSRF保护。
集成
集成到ASP.NET MVC客户端
如果你在MVC工程中使用Web API,不需要额外的配置。即使你在其他进程中自己寄宿你的Web API层,只要你在一个配置的MVC应用中发起AJAX请求,就不需要配置。
集成到其他客户端
如果你的客户端是不同种类的应用(比如说,一个独立的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
特征
ASP.NET Core MVC相比之前的版本(ASP.NET MVC 5.x)有更好的方伪造机制:
- 它有AutoValidateAntiforgeryTokenAttribute类,这个类可以为所有的POST、PUT、PATCH和DLETE actions自动进行防伪造校验。
- 它有ValidateAntiForgeryToken和IgnoreAntiforgeryToken特性,用来控制token校验。
- 如果没有显示禁用它,会自动为HTML表单添加方伪造安全token。所以,在大多数情况下需要调用@Html.AntiForgeryToken()方法。
- 它可以从HTTP报头和表单字段中读取请求token。
ABP添加了下面的特征:
- 自动为所有的AJAX请求报头添加防伪造token。
- 提供abp.security.antiForgery.getToken()函数在javascript中获取token,即使你并不怎么需要它。
集成
启动模板已经集成了CSRF保护。如果你需要手动添加到工程中(可能你的工程在我们添加它之前创建的),跟随下面的向导。
Startup类
首先,当在Startup类的ConfigureServices中添加MVC时,我们需要给全局过滤器添加AutoValidateAntiforgeryTokenAttribute:
services.AddMvc(options =>
{
options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
因此,所有的MVC actions(除了GET,HEAD,OPTIONS和TRACE)将会自动校验防伪造token。
布局视图
需要在我们的Layout视图中添加如下的代码:
@using Abp.Web.Security.AntiForgery
@inject IAbpAntiForgeryManager AbpAntiForgeryManager
@{
AbpAntiForgeryManager.SetCookie(Context);
}
这样,所有使用这个视图的页都会包含他。它在javascript端创建并设置合适的token cookies。如果你有多个布局视图,需要将所有布局视图添加这段代码。
这些就是所有我们需要为ASP.NET Core MVC应用做的工作。所有的AJAX请求会自动处理。对于非ajax表单提交,如果你使用asp-*标签,ASP.NET Core会自动添加防伪造字段。所以,一般不需要使用@Html.AntiForgeryToken()。
客户端类库
对于所有的AJAX请求,防伪造token应该在请求报头中提供,如我们之前所描述的那样。这里,我们将看到它是如何完成的。
jQuery
abp.jquery.js定义了一个AJAX拦截器,它会为每次请求的报头添加防伪造token。它从abp.security.antiForgery.getToken() javascript函数获得token。
Angular
Angular自动为所有的AJAX请求添加防伪造token。参见Angularjs$http文档中的Cross Site Request Forgery(XSRF)保护。ABP默认使用相同的cookies和header名称。所以,Angular集成是开箱即用的。
其他类库
对于AJAX请求,如果你使用任何其他类库,有以下三种选择:
拦截XML HttpRequest
因为所有的类库都会使用javascript本地的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);
使用类库拦截器
好的类库会提供拦截点(如jquery和angularjs)。所以,跟随你供应商的文档来学习如何拦截请求和操作报头。
手动添加Header
最后的选择,你可以使用abp.security.antiForgery.getToken()来获取token并手动为每个请求添加报头。但是,你几乎不需要这样做,按如上描述的就可解决问题。
内部构件
你可能惊讶ABP是如何处理它的?实际上,我们使用了在之前提到的angularjs文档中相同的机制。ABP在cookie中存储token并使用这个cookie设置请求报头。它也很好的集成到了ASP.NET MVC,Web API和Core框架,以便能够校验它。
ABP官方文档翻译 6.7 CSRF/XSRF保护的更多相关文章
- ABP官方文档翻译 6.1.1 MVC控制器
ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...
- ABP官方文档翻译 5.1 Web API控制器
ASP.NET Web API控制器 介绍 AbpApiController基类 本地化 其他 过滤器 审计日志 授权 反伪造过滤器 工作单元 结果包装和异常处理 结果缓存 校验 模型绑定器 介绍 A ...
- ABP官方文档翻译 0.0 ABP官方文档翻译目录
一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...
- ABP官方文档翻译 10.1 ABP Nuget包
ABP Nuget包 Packages Abp Abp.AspNetCore Abp.Web.Common Abp.Web Abp.Web.Mvc Abp.Web.Api Abp.Web.Api.OD ...
- ABP官方文档翻译 5.4 SwaggerUI集成
SwaggerUI集成 介绍 ASP.NET Core 安装Nuget包 配置 测试 ASP.NET 5.x 安装Nuget包 配置 测试 介绍 在它的网站上:“...使用Swagger可用的API, ...
- 0.0 ABP官方文档翻译目录
一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...
- ABP官方文档翻译 2.5 设置管理
设置管理 介绍 关于 ISettingStore 定义设置 设置范围 重写设置定义 获取设置值 服务端 客户端 更改设置 关于缓存 介绍 每个应用都需要存储设置,并且在应用的某些地方需要使用这些设置. ...
- ABP官方文档翻译 9.3 NHibernate集成
NHibernate集成 Nuget包 配置 实体映射 仓储 默认实现 自定义仓储 应用程序特定基础仓储类 ABP可以使用任何ORM框架,它内置集成NHibernate.此文档将讲解ABP如何使用NH ...
- ABP官方文档翻译 9.2 Entity Framework Core
Entity Framework Core 介绍 DbContext 配置 在Startup类中 在模块PreInitialize方法中 仓储 默认仓储 自定义仓储 应用程序特定基础仓储类 自定义仓储 ...
随机推荐
- 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案
基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...
- 我的第一次Pascal程序
今天刚刚来学点Pascal语言,都怪我买的书大多是用Pascal语言写的,所以我只能试着学一点咯! 来一段程序员最经典的Hello World! ; begin write('Hello World! ...
- [bzoj2638] 黑白染色
比较蛋疼的是我们可以先染个底色,再在底色上染别的东西. 由ccz大爷的题解可得..将目标状态里相同颜色的联通块缩点后,枚举起点,生成树里的最大节点深度就是需要的次数了, 如果最大深度是白色的话记得-1 ...
- Codeforces-8VC Venture Cup 2016-Elimination Round-626A.暴力 626B.水题 626C.二分
A. Robot Sequence time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- hdu_2030
一个小小知识点,统计字符串中汉字出现的次数,直接给出代码 //ASCII码的范围是0-127所以,超出范围的都是汉字,因为一个汉字占两个字符位置,所以结果除以2就可以了 #include<cst ...
- 一步步教你创建自己的数字货币(代币)进行ICO
本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 ...
- 文件末尾判断feof
feof 作用:如果文件结束,则返回非0值,否则返回0 但要注意的是feof要读取到文件结束标志EOF后,才能判断文件是否结束. 所以使用while(!feof(pFile))会出现最后fread会返 ...
- Debug模式下程序卡
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用. D ...
- XML中文乱码问题
XML中文乱码问题
- github中删除项目