ABP理论之CSRF

简介:

本篇目录

  • 介绍
  • ASP.NET MVC
  • ASP.NET WEB API
  • ASP.NET Core【以后补上】
  • 客户端类库
  • 内部原理

    介绍

    CSRF【Cross-Site Request Forgery】跨站请求伪造是一种攻击类型,一般指的是一个恶意的网站、邮件、博客、即时消息、或程序使得用户的web浏览器对当前用户已认证的可信任网站执行一个自己不愿执行的操作。想要详细了解的可以查看百度CSRF,扩展阅读OWASP。

    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框架。

  • 这里简明描述一下如何在ASP.NET Web API中实现。




  • 本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/ABPCSRF.html,如需转载请自行联系原作者

目录
相关文章
|
5月前
|
自动驾驶 5G 网络性能优化
5G标准化背后的江湖:技术规范如何塑造未来通信
5G标准化背后的江湖:技术规范如何塑造未来通信
209 19
|
9月前
|
算法
基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真
本课题基于爬山法MPPT算法,对光伏发电系统进行Simulink建模与仿真。使用MATLAB2022a版本,通过调整光伏电池的工作状态以实现最大功率输出。爬山法通过逐步优化工作点,确保光伏系统在不同条件下均能接近最大功率点。仿真结果显示该方法的有效性,验证了模型的正确性和可行性。
|
12月前
|
域名解析 弹性计算 缓存
阿里云国际云服务器全局流量分析功能详细介绍
阿里云国际云服务器全局流量分析功能详细介绍
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之ACK/ASK支持ECI的Serverless Container如何解决
Kubernetes 的架构问题之ACK/ASK支持ECI的Serverless Container如何解决
222 8
|
数据采集 传感器 存储
数据采集
【6月更文挑战第16天】数据采集。
286 12
|
存储 Java 编译器
Java中serialVersionUID的作用
Java中serialVersionUID的作用
|
机器学习/深度学习 人工智能 算法
【AI 场景】在自主武器中使用人工智能的伦理影响
【5月更文挑战第4天】【AI 场景】在自主武器中使用人工智能的伦理影响
【AI 场景】在自主武器中使用人工智能的伦理影响
|
机器学习/深度学习 存储 监控
基于YOLOv8深度学习的遥感地理空间物体检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测(1)
基于YOLOv8深度学习的遥感地理空间物体检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测
|
前端开发 Java 关系型数据库
基于Springboot实现图书管理系统
基于Springboot实现图书管理系统
299 1
|
运维 监控 安全
阿里云云通信短信服务安全之安全责任共担与安全合规
阿里云云通信长久以来致力于为客户提供稳定可靠、安全可信、合法合规的通信服务,利用先进技术、建立产品体系、严格管理人员等不同手段以保护客户及合作伙伴数据的机密性、完整性、可用性,以数据安全、用户隐私保护作为阿里云云通信的最高准则。
633 0