CSRF/XSRF保护

介绍

  "跨站请求伪造(CSRF)是网络攻击的一种类型,当一个恶意的网站、email、博客、即时通讯或程序导致用户的浏览器在一个用户授权的网站上执行了一个不需要的action时发生"(OWASP)。

  在这里也有简单的介绍解释了如何在ASP.NET Web API上实现这种攻击。

  ABP框架简化并自动防范CSRF攻击。启动模板里包含相关的预配置。在本文档中,将解释保护机制是如何集成到ABP平台及如何工作的。

HTTP动词

  GET,HEAD,OPTIONSTRACE这几个 HTTP动词不需要保护,因为通常他们是没有副作用的(不改变数据库)。ABP只为POST、PUT、PATCHDELETE动词实现了自动伪造保护,你可以使用在本文档中定义的特性来改变这种行为。

非浏览器客户端

  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、PATCHDELETE 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类,这个类可以为所有的POSTPUTPATCHDLETE actions自动进行防伪造校验。
  • 它有ValidateAntiForgeryTokenIgnoreAntiforgeryToken特性,用来控制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保护的更多相关文章

  1. ABP官方文档翻译 6.1.1 MVC控制器

    ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...

  2. ABP官方文档翻译 5.1 Web API控制器

    ASP.NET Web API控制器 介绍 AbpApiController基类 本地化 其他 过滤器 审计日志 授权 反伪造过滤器 工作单元 结果包装和异常处理 结果缓存 校验 模型绑定器 介绍 A ...

  3. ABP官方文档翻译 0.0 ABP官方文档翻译目录

    一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...

  4. 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 ...

  5. ABP官方文档翻译 5.4 SwaggerUI集成

    SwaggerUI集成 介绍 ASP.NET Core 安装Nuget包 配置 测试 ASP.NET 5.x 安装Nuget包 配置 测试 介绍 在它的网站上:“...使用Swagger可用的API, ...

  6. 0.0 ABP官方文档翻译目录

    一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...

  7. ABP官方文档翻译 2.5 设置管理

    设置管理 介绍 关于 ISettingStore 定义设置 设置范围 重写设置定义 获取设置值 服务端 客户端 更改设置 关于缓存 介绍 每个应用都需要存储设置,并且在应用的某些地方需要使用这些设置. ...

  8. ABP官方文档翻译 9.3 NHibernate集成

    NHibernate集成 Nuget包 配置 实体映射 仓储 默认实现 自定义仓储 应用程序特定基础仓储类 ABP可以使用任何ORM框架,它内置集成NHibernate.此文档将讲解ABP如何使用NH ...

  9. ABP官方文档翻译 9.2 Entity Framework Core

    Entity Framework Core 介绍 DbContext 配置 在Startup类中 在模块PreInitialize方法中 仓储 默认仓储 自定义仓储 应用程序特定基础仓储类 自定义仓储 ...

随机推荐

  1. hdu_1025(LIS Nlog(N)算法)

    题意:自己慢慢读吧.大概就是道路两边建路,给出建路需求,要求两条路不能有交叉,问最多可以建多少条路. 题解:一看数据范围500000,应该是dp,再画个图模拟一下,发现实质就是求最长上升子序列,很自然 ...

  2. js BOM DOM

    BOM对象 BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其他与页面内容不直接相关的动作. 简而言之就是使 JavaScript ...

  3. 编写自己的JavaScript方法库

    下面列出了我在项目中经常使用到的一些方法,这些方法可以很方便的提高我们的工作效率,代码在GitHub上面,点击目录就可以跳转了,欢迎大家通过fork,改编和优化成自己的JavaScript方法库. 目 ...

  4. mysql下优化表和修复表命令使用说明(REPAIR TABLE和OPTIMIZE TABLE)

    REPAIR TABLE `table_name` 修复表 OPTIMIZE TABLE `table_name` 优化表 show create table tablename   表结构 REPA ...

  5. Thinkphp5.0+Vue2.0前后端分离框架Vuethink

    VueThink是一套基于Vue全家桶(Vue2.x + Vue-router2.x + Vuex)+ Thinkphp的前后端分离框架. 脚手架构建也可以通过vue官方的vue-cli脚手架工具构建 ...

  6. 邓_phpcms_二次开发_创建插件

    Phpcms_V9           [test]测试 ================================================================ ====== ...

  7. Contiki 源代码目录结构

    最近要在烧写contiki的CC2650上做一些简单的实验,需要对contiki的目录结构有一个简单的了解.本文使用的是contiki 3.0版本,并且参考了百度文库上的一篇文档:https://we ...

  8. Django文件上传三种方式以及简单预览功能

    主要内容: 一.文件长传的三种方式 二.简单预览功能实现 一.form表单上传 1.页面代码 <!DOCTYPE html> <html lang="en"> ...

  9. spring task 定时

    最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依 ...

  10. Java 中的变量

    变量 Java 程序的变量大体可分为成员变量和局部变量. 局部变量 形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡. 方法内的局部变量:在方法内定义的局部变量,必须在方 ...