在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击

什么是跨站请求伪造

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。【1】 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

想了解更多,请查看维基百科上的详细介绍。

使用 Asp.Net Core 内置的 Antiforgery

Asp.Net Core 应用中内置了 Microsoft.AspNetCore.Antiforgery 包来支持跨站请求伪造。如果你的应用引用了 Microsoft.AspNetCore.App 包, 则就已经包含了 Microsoft.AspNetCore.Antiforgery 。如果没有, 则可以使用下面的命令来添加这个包:

dotnet add package Microsoft.AspNetCore.Antiforgery

添加了这个包之后, 需要先修改 Startup.cs 文件中的 ConfigureServices 方法, 添加下面的配置:

public class Startup {  public void ConfigureServices(IServiceCollection services) {    services.AddAntiforgery(options => {      options.Cookie.SameSite = SameSiteMode.Lax;            options.HeaderName = "X-XSRF-TOKEN";    });  }}

在 SecurityController.cs 文件中添加一个 Api , 来颁发凭据:

[Route("api/[controller]")][ApiController]public class SecurityController : Controller {  private IAntiforgery antiforgery;  public SecurityController(    IAntiforgery antiforgery  ) {    this.antiforgery = antiforgery;  }  [HttpGet("xsrf-token")]  public ActionResult GetXsrfToken() {    var tokens = antiforgery.GetAndStoreTokens(HttpContext);            Response.Cookies.Append(      "XSRF-TOKEN",      tokens.RequestToken,      new CookieOptions {        HttpOnly = false,        Path = "/",        IsEssential = true,        SameSite = SameSiteMode.Lax      }    );    return Ok();  }}

当客户端请求 ~/api/security/xsrf-token 时, 服务端发送两个 Cookie :

  • .AspNetCore.Antiforgery.xxxxxx 一个 HTTP Only 的 Cookie , 用于服务端验证;

  • XSRF-TOKEN 客户端需要将这个 Cookie 的值用 X-XSRF-TOKEN 的 Header 发送回服务端, 进行验证;

注意:这两个 Cookie 不支持跨域请求, 只能在相同的站点内请求, 也是出于安全性方面的考虑。

可以为某一个 ApiController 或者 Action 方法单独添加 ValidateAntiForgeryTokenAttribute标记来验证 XSRF-TOKEN, 也可以全局注册一个 AutoValidateAntiforgeryTokenAttribute 过滤器来进行自动验证, 代码如下:

public class Startup {  public void ConfigureServices(    IServiceCollection services,    IHostingEnvironment env  ) {    services.AddMvc(options => {            if (env.IsProduction()) {        options.Filters.Add(          new AutoValidateAntiforgeryTokenAttribute()        );      }    });  }}

注意问题:不是所有的方法都需要进行 XSRF 认证,除了 GET, HEAD, OPTIONS 和 TRACE 之外的方法才支持 XSRF 认证。

Angular 内置支持

Angular 的 Http 模块内置支持 XSRF , 前提条件如下:

  • 存在客户端可以操作的名称为 XSRF-TOKEN 的 Cookie ;

  • 该 Cookie 不能是 HttpOnly 的, 否则客户端脚本无法读取;

  • 该 Cookie 的 Path 必须为 / ;

这三个条件都满足, 则在向服务端请求时自动发送名称为 X-XSRF-TOKEN 的 Header , 值则为 XSRF-TOKEN 的 Cookie 的值, 这样就回自动满足上面的服务端的设置, 实现自动防御跨站请求伪造。

原文地址:https://beginor.github.io/2019/05/27/anti-forgery-with-asp-net-core-and-angular.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #700 (Div. 1) C. Continuous City 构造 + 二进制

传送门 文章目录题意:思路:题意: 构造一个图,使其从111到nnn的路径的长度与[L,R][L,R][L,R]中某个值一一对应,不能有两条路径长度一样,且每个值都必须出现一次,每两个点之间只能连一条边。 n≤…

HDU2021多校第五天 1009 Array-树状数组求二阶前缀和

https://acm.hdu.edu.cn/showproblem.php?pid7020 题目大意:求出区间众数严格大于区间一半大小的子区间的数量。 思路:先对每一个数求出对应的位置排列,S[j]代表1-有多少个i,易得s[r]-s[l]>r-l-(s[r]-s[l])的时候子区间{l1&a…

C# 8 新增小功能

尽管 C# 8 应该会在今年发布,并且 C# 8.x 和 9 的路线图也开始形成,但是,微软正在继续审查下一个版本的特性。目标类型表达式假设我们有 A、B 和 C 三种类型,其中类型 B 和 C 是类型 A 的子类型。如果我们使用如下所示的语句&…

【SDOI2014】数表【莫比乌斯反演】【树状数组】

传送门 传送门 题意: TTT组询问给定n,m,an,m,an,m,a,求 ∑i1N∑j1M[(∑d∈N∗[d∣i][d∣j]d)≤a]∑d∈N∗[d∣i][d∣j]d\sum_{i1}^{N}\sum_{j1}^{M}[(\sum_{d \in N^*}[d\mid i][d \mid j]d)\leq a]\sum_{d \in N^*}[d\mid i][d \mid j]di1∑N​j1∑M​[(d∈N∗∑…

Codeforces Global Round 14 E. Phoenix and Computers 思维 + dp

传送门 文章目录题意:思路:题意: 有nnn台电脑,你可以手动打开某个电脑,如果第i−1,i1i-1,i1i−1,i1台电脑都打开了,那么第iii台电脑会自动打开。不能手动打开自动打开的电脑,问有多少种打开的方…

2021HDU多校第五场1004 Another String-双指针

https://acm.hdu.edu.cn/showproblem.php?pid7015 题意:对于每次以i来分割字符串,计算两个分割串的子串的k-匹配的数量。 思路:当我们计算到ans[i]是,我们可以当成从ans[i-1]加上【1-i】字符串和【i1,n】的k-匹配数量…

C# 默认接口方法更新完成,很多细节问题尚待解决

随着对默认接口方法的支持越来越接近完成,一些潜在的问题被提了出来。虽然已经完成了很多工作,但这是一个复杂的特性,许多细节问题还没有解决。但首先,这里有一些已解决的问题。接口允许使用 static 和 const 字段了。除 和! 之外…

【洛谷3768】简单的数学题【莫比乌斯反演】【杜教筛】【小学奥数】

传送门 题意:给定p,Np,Np,N,求 ∑i1N∑j1Nijgcd(i,j)modp\sum_{i1}^{N}\sum_{j1}^{N}ijgcd(i,j)\text{ }mod \text{ }pi1∑N​j1∑N​ijgcd(i,j) mod p ppp为质数,在1e91e91e9左右 N≤1e10N \leq 1e10N≤1e10 神仙题 前置芝士:杜教筛 懒得…

newcode Gene Tree 点分治

传送门 文章目录题意:思路:题意: 求一棵树的每对叶子节点之间距离平方的和。 思路: 这个题貌似可以容斥,但是我不会,所以我写了个淀粉质。 要知道,淀粉质的思想就是将子树内部的递归处理&…

2021HDU多校第九场1008HDU7073 Integers Have Friends 2. 随机化

HUD地址:https://acm.hdu.edu.cn/showproblem.php?pid7073 题目大意:选择数组中最多的数,使得他们模m同余(m>2)。求最大的数量。 思路:然后我们全选奇数或者全选偶数的话,那么我们的答案是…

一个引发程序员们干架的问题

这里是Z哥的个人公众号每周五早8点 按时送达当然了,也会时不时加个餐~我的第「77」篇原创敬上在一个分布式系统的开发团队中,有一些问题是很容易产生程序员之间矛盾的。其中之一就是「业务归属」,就是当新加/修改一个业务的时候&a…

newcode Islands 思维

传送门 文章目录题意:思路:题意: 给你两个圆,上面依次有nnn个点,编号为1−n1-n1−n的排列,给出一种连边方式,使得每个点都被遍历且连线不能相交,没有方式的话输出−1-1−1。 思路&…

微服务探索与实践—服务注册与发现

前言微服务从大规模使用到现在已经有很多年了,从之前的探索到一步步的不断完善与成熟,微服务已经成为众多架构选择中所必须面对的一个选项。服务注册与发现是相辅相成的,所以一般会合起来思索。其依托组件有很多,比如Zookeeper,Co…

快速沃尔什变换:从入门到背板(含推导过程)

前(che)言(dan) FWTFWTFWT是个神奇的东西。 然而网上多数讲解多数直接给结论,顶多用归纳法证一证。 所以本文会讲解FWTFWTFWT的推导过程。 虽然也用到了构造,但是好背得多 参考博客:https:/…

微服务探索与实践—总述

背景软件开发是一个不断发展的过程,从当初的面向过程为主到如今的面向对象的开发,软件开发者不断探索与实践更加符合时代发展要求的开发模式与架构思想,而这,也在极大程度上提高了软件开发的效率。微服务是一种架构模式或者说是架…

P4097 [HEOI2013]Segment 李超线段树

传送门 文章目录题意:思路:题意: 实现以下两个操作: (1)(1)(1)在平面上加入一条线段。记第iii条被插入的线段的标号为iii (2)(2)(2)给定一个数kkk,询问与直线xkxkxk相交的线段中,交点纵坐标最大的线段的编…

【CF1204D】Kirk and a Binary String【结论题】【LIS】

传送门 题意:给一个01串SSS,求一个等长的01串TTT SSS和TTT所有对应位置的子串最长不下降子序列长度(以下简称LIS\text{LIS}LIS)相同TTT中0的数量尽量多 ∣S∣≤100000|S| \leq 100000∣S∣≤100000 对于一个01串SSS,…

这周,全球首个IT技术全中文免费学习平台诞生了!太惊艳!

本周三的Developer Wednesday为大家揭秘了Microsoft Learn网站的全新学习模式一时间Microsoft Learn圈粉无数如果你正在为错过直播而暴风哭泣等一等,看这里!全程高清回播将为你持续解密这一次你一定不可以再错过了哦!什么是Microsoft Learn&…

【CF1182D】Complete Mirror【树的重心】

传送门 题意:给一棵NNN个结点的树,你需要钦定一个根,使得所有深度相同的点的度数相同。 N≤100000N \leq 100000N≤100000 用脑子想一想,就是根节点直接相连的子树都长得一模一样。 如果根节点度数大于1,我们发现它…

P1989 无向图三元环计数 思维 + 建图

传送门 文章目录题意:思路:题意: 统计无向图中三元环的个数。 思路: 很明显有一种暴力的方法,就是枚举每条边,让后再跑两个点的所有边,可以卡到复杂度O(m2)O(m^2)O(m2)。 我们可以考虑给点之…