XSRF CSRF 保护

介绍

“ 跨站点请求伪造(CSRF)是一种攻击,当恶意网站,电子邮件,博客,即时消息或程序导致用户的Web浏览器在用户所在的受信任站点上执行不需要的操作时发生此类攻击。目前已通过身份验证“(OWASP)。

这里还简要介绍    它如何在ASP.NET Web API中实现它。

ABP框架尽可能简化和自动化CSRF保护。在  启动模板  来与这个预配置和它的作品外的即装即用。在本文档中,我们将解释它如何集成到ASP.NET平台中以及它如何工作。

Http动词

您通常不需要保护GET,HEAD,OPTIONS和TRACE动作HTTP动词,因为它们通常没有副作用(它们不会更改数据库)。虽然ABP假定这一点并仅对POST,PUT,PATCH和DELETE谓词实现Anti Forgery保护,但您可以使用本文档中定义的属性更改此行为。

非浏览器客户端

CSRF是一种攻击类型的攻击,因为浏览器会在所有请求中发送所有cookie(包括auth cookie),包括跨域请求。这对于非浏览器客户端(如移动应用程序)来说不是问题。ABP框架了解其差异并自动跳过非浏览器客户端的防伪验证。

ASP.NET MVC

特征

ASP.NET MVC有自己的内置AntiForgery系统,但有一些缺点:

ABP做了以下事情来克服这些问题:

通过这种方式,CSRF保护几乎可以无缝地工作。

积分

启动模板已经开箱即用地集成了CSRF保护。如果您需要手动将其添加到项目中(可能您有遗留项目),请遵循本指南。

布局视图

我们需要在Layout视图中添加以下代码:

@{
    SetAntiForgeryCookie();
}

使用此布局的所有页面都将包含它。此方法在基本ABP视图类中定义。它创建并设置适当的令牌cookie,并使JavaScript做侧面工作。如果您有多个布局,请将其添加到所有布局中。

这就是我们为ASP.NET MVC应用程序所要做的。所有AJAX请求都将自动受到保护,但我们仍应使用@ Html.AntiForgeryToken()HTML帮助程序来处理未通过AJAX发布的HTML表单。无需为相应的操作添加ValidateAbpAntiForgeryToken属性。

组态

默认情况下启用XSRF保护。您可以在模块的PreInitialize方法中禁用或配置它  例:

Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false;

您还可以使用Configuration.Modules.AbpWebCommon()。AntiForgery对象配置令牌和cookie名称  

ASP.NET Web API

特征

ASP.NET Web API不包含防伪机制。但是,ASP.NET Boilerplate提供了为ASP.NET Web API控制器添加自动CSRF保护的基础结构。

积分

使用ASP.NET MVC客户端

如果您在MVC项目中使用Web API,则不需要其他配置。即使您在另一个进程中自托管Web API层,只要您从配置的MVC应用程序发出AJAX请求,就不需要进行任何配置。

与其他客户

如果您的客户端是不同类型的应用程序(例如,不能使用上述SetAntiForgeryCookie()方法的独立Angular应用程序),那么您应该提供一种设置防伪令牌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;
        }
    }
}

然后,您可以从客户端调用此操作来设置cookie。

ASP.NET核心

特征

 与以前的版本(ASP.NET MVC 5.x)相比,ASP.NET Core MVC具有更好的  Anti Forgery机制:

ABP增加了以下功能:

积分

已经集成了启动模板以使用开箱即用的CSRF保护。如果您需要手动将其添加到项目中(可能是在我们添加项目之前创建了项目),请遵循本指南。

启动类

首先,我们必须将AutoValidateAntiforgeryTokenAttribute添加到全局过滤器,同时在Startup类的ConfigureServices方法中添加MVC:

services.AddMvc(options =>
{
    options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});

这样,所有MVC操作(除了之前声明的GET,HEAD,OPTIONS和TRACE)将自动验证防伪令牌。

布局视图

我们必须在Layout视图中添加以下代码:

@using Abp.Web.Security.AntiForgery
@inject IAbpAntiForgeryManager AbpAntiForgeryManager
@{
    AbpAntiForgeryManager.SetCookie(Context);
}

使用此布局的所有页面都将包含它。它创建并设置适当的令牌cookie,并使JavaScript完成所有工作。如果您有多个布局,请将其添加到所有布局中。

这就是我们必须为ASP.NET Core MVC应用程序做的所有事情。所有AJAX请求都将自动生效。对于非ajax表单提交,如果您在表单中使用asp- *标记之一,ASP.NET Core会自动添加防伪标记字段。所以通常不需要使用@ Html.AntiForgeryToken()。

客户端库

必须在所有AJAX请求的请求头中提供防伪令牌,如上所述。我们将在这里看到它是如何完成的。

jQuery的

abp.jquery.js脚本定义了一个AJAX拦截器,它将防伪标记添加到每个请求的请求标头中。它从abp.security.antiForgery.getToken()JavaScript函数中获取令牌。

AngularJS

AngularJS自动将防伪令牌添加到所有AJAX请求中。请参阅 AngularJS $ http文档中的  跨站点请求伪造(XSRF)保护部分  默认情况下,ABP使用相同的cookie和标头名称。因此,Angular集成开箱即用。

其他图书馆

如果您使用任何其他库来进行AJAX请求,则有三种选择:

拦截XMLHttpRequest

由于所有库都使用JavaScript的本机AJAX对象XMLHttpRequest,因此您可以定义一个简单的拦截器来将标记添加到标头:

(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),因此请按照供应商的文档了解如何拦截请求和操作头文件。

手动添加标题

作为最后一个选项,您可以使用abp.security.antiForgery.getToken()方法获取令牌,并为每个请求手动将其添加到请求标头中。您可能不需要这个并且可以通过使用上述方法解决此问题。

内幕

您可能想知道“ABP如何处理这个问题?”。实际上,我们使用前面提到的AngularJS文档中描述的相同机制。ABP将令牌存储到cookie中(如上所述)并使用该cookie设置请求头。为了验证它,它还可以很好地集成到ASP.NET MVC,Web API和Core框架中。

nidie.com.cn - 用心与你沟通