レポートはどのシステムでも非常に一般的であり、それらのいくつかは処理するのに非常に重い場合があります。したがって、この場合、レポートの生成中にアプリケーションが劣化し、他のユーザーに影響を与える可能性があります。しかし、どうすればこれを避けることができますか?最初の考えは、底をブロックすることですよね?ええと、ハッキングはとても簡単です。ユーザーはHTMLプロップを編集して再度有効にすることができます。したがって、最良のオプションは、リクエスト制限制御戦略を使用して、サーバー側でブロックすることです。
AspNetCoreRateLimit 、要求制御に役立つライブラリです。ルールを定義して、クライアントが一定期間にわたってリソースを呼び出すことができる回数を決定できます。
しかし、それはどのように機能しますか?
AspNetCoreratelimitは、MemoryCacheソリューションを使用して、クライアントのリクエストに関する情報を保存します。たとえば、クライアントは、特定のエンドポイントに対して5秒間のインターバルで10リクエストのみを行うことができます。したがって、各要求はメモリキャッシュに保存され、クライアントがこの制限を超えると、アプリケーションはリクエストを停止し、HTTPエラーステータスを返します。
まず第一に、ライブラリASPNETCORERATELIMITをインストールする必要があります
aspnetcoreratelimitを構成する最良のオプションは、appsettings.json内のすべての情報を定義することです。したがって、次のようなブロックを作成します。
"IpRateLimiting": {
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"GeneralRules": [
{
"Endpoint": "*/api/test",
"Period": "2s", //interval
"Limit": 2 //limit of request in the interval
}
]
},
ルールを構成していると、 Startup.csにいくつかの行を追加する必要があります。
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
//AspNetCoreRateLimit uses MemoryCache to control the numbers of requests
services.AddMemoryCache();
//Adding AspNetCoreRateLimit rules
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
//Adding the store
services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
//Adding the request counter
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddHttpContextAccessor();
services.AddControllers();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "RequestLimit", Version = "v1" });
});
}
そして最後のステップは、サービスをアクティブにすることです。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "RequestLimit v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseIpRateLimiting() //Adding this block;
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
そして、それは完了です、今、私たちのAPIには要求制御があります。構成をカスタマイズして詳細ルールに従うことができます。すべてのオプションはhttps://github.com/stefanprodan/aspnetcoreratelimitにリストされています。