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

扫码关注我们,我们学的不仅是框架,更是梦想!更多技术文章查看 http://letyouknow.net/

本文分享自微信公众号 - dotNet框架学苑(LetYouKnowNet)

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

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端加油站

自定义微信登录扫码样式解决办法

版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

39620
来自专栏大数据学习笔记

CDH和HDP下载地址

版权声明:本文为博主原创文章,欢迎转载。 ...

70820
来自专栏软件开发-青出于蓝

SpringFramework之mvc的HandlerMapping

    我们从DispatcherServlet的doDispatch方法说起,如下List-2,getHandler(processedRequest)会调用...

10120
来自专栏转行程序员

如何自学一门编程语言

就我所知,国内一线互联网公司慢慢都抛弃php ,即使个别项目还是跑的php,也可能是边缘系统或者已经再重构的计划内了。

17040
来自专栏数据挖掘

python3抓取异步百度瀑布流动态图片(一)查找post并伪装头方法

用火狐打开百度图片-->打开firebug-->输入GIF图-->搜索-->点击网络-->全部

13140
来自专栏数据挖掘

链家二手房楼盘爬虫

想看下最近房价是否能入手,抓取链家 二手房 、 新房 的信息,发现广州有些精装修 88平米 的 3房2厅 首付只要 29 万!平均 1.1万/平:

21130
来自专栏数据挖掘

SmartDo数据挖掘思路

数据储存首先要搭建储存的框架,初定拟定每个DB储存4个类目的所有信息,每个DB的分支如下:

7430
来自专栏腾讯NEXT学位

科普一下 CORS 以及如何节省一次 OPTIONS 请求

“ 相信做前端开发的同学对同源策略都比较熟悉,而如何解决跨域问题基本上也是前端面试必考题之一。 ” CORS标准协议 为了解决跨域资源共享问题,浏览器厂商和标...

30030
来自专栏数据挖掘

淘宝天猫商品库存抓取分析 下载代码运行代码

因此花费两天时间抓取完成,基于python3 抓取, flask 可视化页面查看,目前支持网页可视化查看:

29030
来自专栏linux运维学习

shell脚本,正则表达式

版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

16330

扫码关注云+社区

领取腾讯云代金券

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