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

安装轮子

我的应用目前一个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!

测试轮子

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

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

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

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

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

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

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

更多高级配置

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

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

本文分享自微信公众号 - 汪宇杰博客(ediwangblog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏钱塘小甲子的博客

在Excel中获得汉字的首字母

Function hztopy(hzpy As String) As String

22710
来自专栏知识分享

9-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)(微信配网配置_开发者基本配置_2)

https://www.cnblogs.com/yangfengwu/p/11062422.html

10410
来自专栏云服务器999+

2019年6月份腾讯云优惠券、代金券、云产品内购价格

https://cloud.tencent.com/redirect.php?redirect=1042&cps_key=6f5f5aedea72d213ca3...

8600
来自专栏finleyMa

CSS自定义属性级联变量var()

https://www.cnblogs.com/bibibobo/p/6140659.html http://www.ruanyifeng.com/blog/...

13110
来自专栏微信公众号【程序员黄小斜】

从三流小公司到一线大厂,聊聊程序员的成长之道

我想,没有一个程序员能够一步登天,一下子达到很高的高度,有些路是我们必须要走的,有些阶段是我们必须要经历的。有入门,才有进阶,才有更上一层楼。

12270
来自专栏云服务器999+

2019腾讯云服务器企业应用最佳配置方案

https://cloud.tencent.com/redirect.php?redirect=1042&cps_key=6f5f5aedea72d213ca3...

8300
来自专栏Jerry的SAP技术分享

ui5 resource file 404 error

所有前缀为mymap的resource 的relative url都设置为从./mymap出发,而不是resources/

10420
来自专栏Jerry的SAP技术分享

where is count server execution interval configured

在Chrome network tab里能观察到周期性的Odata call:

10030
来自专栏云服务器999+

小型企业如何选择腾讯云服务器

https://cloud.tencent.com/redirect.php?redirect=1042&cps_key=6f5f5aedea72d213ca3...

17600
来自专栏西城知道

万能工具,完全免费实现各种超实用功能

电脑已经成为了我们生活和工作的一部分,现在绝大部分人的工作都离不开电脑。当然,学习也离不开电脑,特别是我们大学生要常常在电脑上下载一些学习资料或者论文,就更离不...

1.1K20

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励