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方法中 仓储 默认仓储 自定义仓储 应用程序特定基础仓储类 自定义仓储 ...
随机推荐
- 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- hdu_2670Girl Love Value(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2670 Girl Love Value Time Limit: 2000/1000 MS (Java/O ...
- SSL协议之数据加密过程详解
前言 总括: 原文博客地址:SSL协议之数据加密过程详解 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书) 博主博客地址:Damonare的个人博客 生活 ...
- Maven打包时去掉项目版本号
Maven打包后,jar或war文件名里带有版本号信息,如projectname0.0.1-SNAPSHOT.jar等,怎么去掉呢? 解决办法: 打开项目pom.xml文件,在<build> ...
- 利用xcode生成的app生成可以在iphone和itouch上运行的ipa安装包
在编译好的真机版目录下的.app文件,至于生成真机可以运行的app的方法,有两种方式,一种是交99美元获得一个证书,另外一种是破解的方式,在此不再详述,本文假设你已经生成了真机上可以运行的app包了( ...
- [转]【Java】内部类(Inner Class)如何创建(new)
简单来说,内部类(inner class)指那些类定义代码被置于其它类定义中的类:而对于一般的.类定义代码不嵌套在其它类定义中的类,称为顶层(top-level)类.对于一个内部类,包含其定义代码的类 ...
- 洛谷 P1231 教辅的组成
P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习 ...
- 黑窗口输入确定数字弹MessageBox(VirtualProtect())
今天有人说到这个就想的弹一下,刚开始弄了一下,发现内存访问有问题想到可能与读写保护有关,所以用了VirtualProtect函数,得到了正确结果 网上这个小东西我自己没发现,就贴一下.. void m ...
- 改变UITableView选中行高亮的颜色
UIView *backView = [[UIView alloc] initWithFrame:self.contentView.frame]; backView.backgroundColor = ...
- HTTP常用方法
GET : 获取资源 get方法用来请求访问已被URI识别的资源. 请求 GET /index.html HTTP/1.1 HOST:www.baidu.com 响应 返回index.html的页面资 ...