山东省建设节能协会网站,宠物网站开发文档,葫芦岛市网站建设,网站正能量不用下载直接进入主页可以吗在网站或API应用中#xff0c;我们为了防止无聊人士或恶意攻击#xff0c;通常希望屏蔽某一IP短时间的内高频率请求。在ASP.NET Core中#xff0c;限制IP请求频率非常简单#xff0c;我们来看看吧。轮子一个.NET Core 目前的生态发展十分迅猛#xff0c;轮子也越来越多。只… 在网站或API应用中我们为了防止无聊人士或恶意攻击通常希望屏蔽某一IP短时间的内高频率请求。在ASP.NET Core中限制IP请求频率非常简单我们来看看吧。轮子一个.NET Core 目前的生态发展十分迅猛轮子也越来越多。只要轮子不爆胎本来就不需要996的.NET开发者就能继续10 5 5这不为了限制IP请求频率我找到了一个不错的轮子AspNetCoreRateLimitGitHub链接https://github.com/stefanprodan/AspNetCoreRateLimit安装轮子我的应用目前一个ASP.NET Core 2.2 MVC的网站我们可以通过NuGet安装这个轮子截至本文它的最新版是3.0.5。Install-Package AspNetCoreRateLimit或 .NET Core CLIdotnet add package AspNetCoreRateLimit修改Startup.cspublic void ConfigureServices(IServiceCollection services){// 需要从appsettings.json中加载配置services.AddOptions();// 存储IP计数器及配置规则services.AddMemoryCache();services.ConfigureIpRateLimitOptions(Configuration.GetSection(IpRateLimiting));services.AddSingletonIIpPolicyStore, MemoryCacheIpPolicyStore();services.AddSingletonIRateLimitCounterStore, MemoryCacheRateLimitCounterStore();// 按照文档这两个是3.x版的breaking change要加上services.AddSingletonIHttpContextAccessor, HttpContextAccessor();services.AddSingletonIRateLimitConfiguration, 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 TaskIActionResult 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