ASP.NET Core IP 请求频率限制

在网站或API应用中,我们为了防止无聊人士或恶意攻击,通常希望屏蔽某一IP短时间的内高频率请求。在ASP.NET Core中,限制IP请求频率非常简单,我们来看看吧。

轮子一个

.NET Core 目前的生态发展十分迅猛,轮子也越来越多。只要轮子不爆胎,本来就不需要996的.NET开发者就能继续10 5 5!这不,为了限制IP请求频率,我找到了一个不错的轮子:

AspNetCoreRateLimit

GitHub链接:https://github.com/stefanprodan/AspNetCoreRateLimit

640?wx_fmt=gif

安装轮子

我的应用目前一个ASP.NET Core 2.2 MVC的网站,我们可以通过NuGet安装这个轮子,截至本文,它的最新版是3.0.5。

Install-Package AspNetCoreRateLimit

或 .NET Core CLI

dotnet add package AspNetCoreRateLimit

修改Startup.cs

public void ConfigureServices(IServiceCollection services)

{

// 需要从appsettings.json中加载配置

services.AddOptions();

// 存储IP计数器及配置规则

services.AddMemoryCache();


services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));

services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();

services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();


// 按照文档,这两个是3.x版的breaking change,要加上

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();

}

以及

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

{

    // 注意顺序,放在 UseMvc 上面

    app.UseIpRateLimiting();

    app.UseMvc();

}

配置轮子

我的网站有一个URL(/fw/{token}),我希望限制1分钟内一个IP最多访问30次。但是对于其他URL,我并不想做任何限制。

[Route("/fw/{token}")]

public async Task<IActionResult> Forward(string token)

在 appsettings.json 里加入

"IpRateLimiting": {

  "EnableEndpointRateLimiting": true,

  "StackBlockedRequests": false,

  "RealIpHeader": "X-Real-IP",

  "ClientIdHeader": "X-ClientId",

  "HttpStatusCode": 429,

  "GeneralRules": [

    {

      "Endpoint": "*:/fw/*",

      "Period": "1m",

      "Limit": 30

    }

  ]

}

EnableEndpointRateLimiting设置为true,意思是IP限制会应用于单个配置的Endpoint上。如果是false的话,只会限制所有 * 的规则,而不能达到针对单个Endpoint配置的目的。

HttpStatusCode设置为429,意思是触发限制之后给客户端返回的HTTP状态码。

GeneralRules里我只配置了一条,针对/fw这URL的限制。其中,开头的 *: 表示任何HTTP VERB,如GET/POST,而结尾的 /* 表示需要考虑/fw后面的参数,也就是我MVC Action参数里的route参数。

针对不同token,会有不同的计数。比如IP为127.0.0.1的用户在1分钟内请求了 /fw/abcd 10次,又请求了 /fw/qwer 25次,也请求了 /fw/996icu 32次。那么对于该用户,/fw/abcd 的机会还剩下20次,/fw/qwer 的机会还剩下5次,而 /fw/996icu 在第31次请求时会返回429。

这里一定要注意,对于有参数的URL,如果不加结尾的 /* 那么轮子就会爆胎,并且把.NET程序员炸进ICU!

640?wx_fmt=gif

测试轮子

我们可以通过浏览器或CRUL测试IP限制。为了方便测试,我暂时把1分钟的请求频率限制为3次。

第一次请求 https://localhost:5001/fw/某token

640?wx_fmt=png

会发现服务器返回的header里多了3个东西:

X-Rate-Limit-Limit: 1m,表示该限制是1分钟以内

X-Rate-Limit-Remaining: 2,表示当前还剩2次机会

X-Rate-Limit-Reset 表示限制的重置时间

而1分钟内第三次访问该URL,就会触发限制,并且返回429

640?wx_fmt=png640?wx_fmt=png

更多高级配置

AspNetCoreRateLimit 还有许多更高级的用法。比如针对Client ID而不是IP做限制、白名单、分布式计数器存储、自定义返回内容等等,可以参见官网文档:

https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/IpRateLimitMiddleware#setup

640?wx_fmt=jpeg

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

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

相关文章

2019 秦皇岛 I - Invoker Gym - 102361I dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 累了&#xff0c;略。 思路&#xff1a; 将这101010个串打乱顺序&#xff0c;每个串最多有666种情况&#xff0c;全部写出来&#xff0c;让后连边。最后直接在转移的时候分别从上一个字符的666个状态转移就…

CF1016G. Appropriate Team(Pollard-pho,FWT,数论)

CF1016G. Appropriate Team Solution 相当于选出的两个数需要满足不存在一个质因子ppp&#xff0c;aia_iai​在ppp的指数比XXX多&#xff0c;aja_jaj​在ppp的指数比YYY少。 我们用Pollard−phoPollard-phoPollard−pho求出YYY所有最多151515个质因数&#xff0c;然后把所有…

Exceptionless - .Net Core开源日志框架

作者&#xff1a;markjiang7m2原文地址&#xff1a;https://www.cnblogs.com/markjiang7m2/p/11020140.html官网地址&#xff1a;http://letyouknow.net今天要给大家介绍的Exceptionless是一个基于 .net core的开源日志框架&#xff0c;Exceptionless的意思是&#xff1a;没有异…

CF981E Addition on Segments 线段树分治 + bitset优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们考虑如果我们选择的区间都包含某个位置&#xff0c;那么这个位置一定是最大值。那么对于每个位置&#xff0c;我们枚举包含其的区间&#xff0c;让后每次加xxx都用bitsetbitsetbitset来…

CF1146F - Leaf Partition(树形dp)

CF1146F - Leaf Partition Solution 感觉做这种细节很多的分类讨论树形dp还是有点乱。 大概有一个naivenaivenaive的想法是&#xff0c;我们令fx,0/1f_{x,0/1}fx,0/1​表示以xxx为根的子树&#xff0c;xxx结点有没有颜色的方案数。 然后如果存在两个有颜色的儿子&#xff0…

开源基于Canal的开源增量数据订阅消费中间件

canal 是阿里巴巴开源的一款基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。我开发的这个CanalSync项目 https://github.com/yuzd/CanalSync >觉得不错帮忙给个star谢谢是基于canal-server之上的数据库同步&消费中间件&#…

E2. Square-free division (hard version) dp + 质因子分解

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你长度为nnn的数组&#xff0c;让后最多修改其中kkk个数(可以修改为任意数)&#xff0c;让后问你分成的最少组是多少。这个组内元素是连续的且不存在任意两个数的积为平方数。 思路&#xff1a; 首先两个…

CF1000G. Two-Paths(树形dp)

CF1000G. Two-Paths Solution 我们发现除了树上(x,y)(x,y)(x,y)最短路径上的边经过一次&#xff0c;其余边要么走000次&#xff0c;要么走222次。 因此考虑先假设每条边走两次&#xff0c;最后把走一次的边的贡献加上。 我们把从(x,y)(x,y)(x,y)路径上的点扩展出去连痛块的…

不装 VS 自己编译安装 Windows Terminal

Windows Terminal 一直没有发布可以直接安装的二进制文件&#xff0c;想自行编译的时候&#xff0c;看到系统需求中包含体积巨大的 Visual Studio 和 Windows SDK&#xff0c;脑袋都大了。直接下载其他人编译好的安装包又不放心&#xff0c;那么就想个办法避免在本地环境编译吧…

Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 期望dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 要从111走到nnn&#xff0c;每次成功走下去的概率为pi100\frac{p_i}{100}100pi​​&#xff0c;如果不成功那就回到111号点继续走。问走完nnn个点的期望是多少。 思路&#xff1a; 以前见过这种失败了就回…

带你了解C#每个版本新特性

上学时学习C#和.NET&#xff0c;当时网上的资源不像现在这样丰富&#xff0c;所以去电脑城买了张盗版的VS2005的光盘&#xff0c;安装时才发现是VS2003&#xff0c;当时有一种被坑的感觉&#xff0c;但也正是如此&#xff0c;让我有了一个完整的.NET的学习生涯。一直都认为学习…

Educational Codeforces Round 106 (Rated for Div. 2) D. The Number of Pairs 数论gcd

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给三个数c,d,xc,d,xc,d,x&#xff0c;求满足c∗lcm(a,b)−d∗gcd(a,b)xc*lcm(a,b)-d*gcd(a,b)xc∗lcm(a,b)−d∗gcd(a,b)x条件的(a,b)(a,b)(a,b)的数量。 思路&#xff1a; 考虑将lcm(a,b)lcm(a,b)lcm(a,b…

从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)

默认情况下&#xff0c;我们打包 NuGet 包时&#xff0c;目标项目安装我们的 NuGet 包会引用我们生成的库文件&#xff08;dll&#xff09;。除此之外&#xff0c;我们也可以专门做 NuGet 工具包&#xff0c;还可以做 NuGet 源代码包。然而做源代码包可能是其中最困难的一种了&…

HDU - 4497 GCD and LCM 数论gcd

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给三个数的lcmlcmlcm和gcdgcdgcd&#xff0c;求满足条件的三元组组合个数。 思路&#xff1a; 首先lcmmodgcd0lcm\bmod gcd0lcmmodgcd0是有组合的条件&#xff0c;否则输出0。 现在可知lcm(x′,y′,z′)lc…

.NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新

我们都知道在6月12日的时候微软发布了.NET Core 3.0的第6个预览版。针对.NET Core 3.0的发布我们国内的微软MVP-汪宇杰还发布的官翻版的博文进行了详细的介绍。具体的可以点这里进行阅读译 | .NET Core 3.0 Preview 6 已发布。而我们这篇文章将会介绍本次更新中对ASP.NET Core和…

Codeforces Round #686 (Div. 3) F. Array Partition 二分 + 线段树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 化简一下题意就是求满足max(1,x)min(x1,y)max(y1,n)max(1,x)min(x1,y)max(y1,n)max(1,x)min(x1,y)max(y1,n)的len1x,len2y−x,len3n−ylen1x,len2y-x,len3n-ylen1x,len2y−x,len3n−y。 思路&#xff1a; …

Dapper.Common基于Dapper的开源LINQ超轻量扩展

Dapper.CommonDapper.Common是基于Dapper的LINQ实现,支持.net core,遵循Linq语法规则、链式调用、配置简单、上手快,支持Mysql,Sqlserver(目前只实现了这两个数据库&#xff0c;实现其他数据库也很轻松)&#xff0c;支持单表&#xff0c;多表&#xff0c;自定义函数等功能。源码…

Codeforces Round #686 (Div. 3) E. Number of Simple Paths 基环树 + 容斥

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一颗基环树&#xff0c;求长度>1>1>1的路径个数。 思路&#xff1a; 先考虑一棵树&#xff0c;他的答案显然是n∗(n−1)2\frac{n*(n-1)}{2}2n∗(n−1)​。因为是个基环树&#xff0c;所以先考…

.NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖

我们有多种工具可以将程序集合并成为一个。比如 ILMerge、Mono.Merge。前者不可定制、运行缓慢、消耗资源&#xff08;不过好消息是现在开源了&#xff09;&#xff1b;后者已被弃用、不受支持且基于旧版本的 Mono.Cecil。而本文介绍用来替代它们的 ILRepack&#xff0c;使用 I…

4G的小程序与5G的Chromium OS?

提到桌面操作系统&#xff0c;Windows 与 macOS 自然是家喻户晓&#xff0c;稍微有点 IT 知识的人也会知道 Linux&#xff0c;而 Fuchsia 和鸿蒙&#xff08;方舟&#xff09;则还在积极开发中&#xff0c;除了这几大类比较热门的&#xff0c;当前还有一大潜力股 Chrome OS&…