از میان افزار جدید محدود کننده نرخ در ASP.NET Core 7 برای محافظت در برابر حملات مخرب به برنامه های خود و اطمینان از استفاده عادلانه از منابع سرور استفاده کنید.
محدود کردن نرخ تکنیکی است که برای محدود کردن تعداد درخواستهای مجاز به یک منبع خاص برای خنثی کردن حملات DDoS و سوء استفادههای API استفاده میشود. پس از رسیدن به آستانه محدود کننده نرخ، درخواستهای بعدی به منبع غیرمجاز، به تأخیر افتاده یا کاهش مییابد.
تا NET 7، اجرای محدودیت نرخ در برنامههای ASP.NET Core با استفاده از بستههای شخص ثالث مانند AspNetCoreRateLimit مورد نیاز است. اما با ASP.NET Core 7، محدودیت نرخ اکنون یک ویژگی داخلی است که به عنوان یک میان افزار طراحی شده برای جلوگیری از سوء استفاده، محافظت در برابر حملات و اطمینان از تخصیص عادلانه منابع در دسترس است.
درباره نحوه استفاده از AspNetCoreRateLimit برای اجرای محدودیت نرخ در نسخههای قبلی ASP.NET Core در مقاله قبلی. در این مقاله، نحوه استفاده از میانافزار جدید داخلی محدودکننده نرخ در ASP.NET Core 7 را بررسی خواهیم کرد.
برای استفاده از نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا بارگیری کنید.
یک پروژه ASP.NET Core 7 Web API در Visual Studio 2022 ایجاد کنید
ابتدا، اجازه دهید یک پروژه ASP.NET Core 7 در Visual Studio 2022 ایجاد کنیم. این مراحل را دنبال کنید:
- Visual Studio 2022 IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
- به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
- بعدی را کلیک کنید.
- در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، کادر «استفاده از کنترلکنندهها (برای استفاده از حداقل APIها علامت آن را بردارید» را علامت بزنید، زیرا ما از حداقل API در این پروژه استفاده نخواهیم کرد. تنظیم «نوع احراز هویت» را روی «هیچ» (پیشفرض) بگذارید.
- مطمئن شوید که چک باکسهای «فعال کردن پشتیبانی از API باز کردن»، «پیکربندی برای HTTPS» و «فعال کردن داکر» علامت نخورده باقی میمانند زیرا ما از این ویژگیها در اینجا استفاده نمیکنیم.
- روی ایجاد کلیک کنید.
ما از این پروژه ASP.NET Core 7 Web API برای کار با میانافزار داخلی محدودکننده نرخ در بخشهای زیر استفاده خواهیم کرد.
محدود کردن نرخ داخلی در ASP.NET Core 7
محدود کردن نرخ در ASP.NET Core 7 به عنوان بخشی از فضای نام System.Threading.RateLimiting در دسترس است. نوع اصلی کلاس پایه انتزاعی RateLimiter است که چندین ویژگی شگفت انگیز دارد.
RateLimiter را می توان با چندین گزینه از جمله حداکثر تعداد درخواست های مجاز، کد وضعیت پاسخ، و پنجره زمانی پیکربندی کرد. بسته به روش HTTP، آدرس IP مشتری و سایر عوامل می توانید محدودیت نرخ را تعیین کنید. شما حتی می توانید به جای رد درخواست ها در صف قرار دهید.
الگوریتمهای محدودکننده نرخ زیر پشتیبانی میشوند:
- پنجره ثابت
- پنجره کشویی
- سطل رمز
- همزمان
برای افزودن میانافزار محدودکننده نرخ به برنامه ASP.NET Core 7 خود، ابتدا باید خدمات مورد نیاز را همانطور که در قطعه کد زیر نشان داده شده است، به ظرف اضافه کنید.
builder.Services.AddRateLimiter(options => { //Write your code to configure the middleware here });
برای افزودن میان افزار به خط لوله، باید روش پسوند UseRateLimiter را مطابق شکل زیر فراخوانی کنید.
app.UseRateLimiter();
میان افزار محدود کننده نرخ را در ASP.NET Core 7 پیکربندی کنید
اکنون، کد زیر را در فایل Program.cs برای پیکربندی محدود کننده نرخ بنویسید.
builder.Services.AddRateLimiter(options => { options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(httpContext => { return RateLimitPartition.GetFixedWindowLimiter(partitionKey: httpContext.Request.Headers.Host.ToString(), partition => new FixedWindowRateLimiterOptions { PermitLimit = 5, AutoReplenishment = true, Window = TimeSpan.FromSeconds(10) }); }); });
فراخوانی به روش AddRateLimiter میان افزار را با مجموعه سرویس ثبت می کند. این مثال از یک GlobalLimiter برای همه درخواست ها استفاده می کند و این GlobalLimiter روی PartitionedRateLimiter تنظیم شده است.
سپس از FixedWindowLimiter برای پر کردن درخواستهای مجاز استفاده میشود. توجه داشته باشید که وقتی برنامه را اجرا میکنید و نقطه پایانی را بیش از حد مجاز فراخوانی میکنید، کد وضعیت HTTP 503 «سرویس در دسترس نیست» برگردانده میشود.
از طرف دیگر، میتوانید میانافزار را طوری پیکربندی کنید که کد وضعیت HTTP 429 «درخواستهای خیلی زیاد» را برگرداند. برای انجام این کار، از قطعه کد زیر استفاده کنید.
options.OnRejected = async (context, token) => { context.HttpContext.Response.StatusCode = 429; await Task.CompletedTask; };
اگر میخواهید پیام خطا را سفارشی کنید، میتوانید به جای آن از قطعه کد زیر استفاده کنید.
options.OnRejected = async (context, token) => { context.HttpContext.Response.StatusCode = 429; await Task.CompletedTask; };
مثال محدود کننده نرخ کامل (منبع Program.cs)
در اینجا کد منبع کامل فایل Program.cs برای مرجع شما آمده است.
using System.Threading.RateLimiting; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddRateLimiter(options => { options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(httpContext => { return RateLimitPartition.GetFixedWindowLimiter(partitionKey: httpContext.Request.Headers.Host.ToString(), partition => new FixedWindowRateLimiterOptions { PermitLimit = 5, AutoReplenishment = true, Window = TimeSpan.FromSeconds(10) }); }); options.OnRejected = async (context, token) => { context.HttpContext.Response.StatusCode = 429; await context.HttpContext.Response.WriteAsync("Too many requests. Please try later again... ", cancellationToken: token); }; }); var app = builder.Build(); app.UseRateLimiter(); // Configure the HTTP request pipeline. app.UseAuthorization(); app.MapControllers(); app.Run();
به جای رد درخواستها در صف قرار دهید
همچنین میتوانید درخواستها را به جای رد کردن در صف قرار دهید. برای رسیدن به این هدف، باید از ویژگی QueueLimit استفاده کنید و مقدار مورد نظر خود را همانطور که در قطعه کد زیر نشان داده شده است تنظیم کنید.
builder.Services.AddRateLimiter(options => { options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(httpContext => { return RateLimitPartition.GetFixedWindowLimiter(partitionKey: httpContext.Request.Headers.Host.ToString(), partition => new FixedWindowRateLimiterOptions { PermitLimit = 5, AutoReplenishment = true, QueueLimit = 5, QueueProcessingOrder = QueueProcessingOrder.OldestFirst, Window = TimeSpan.FromSeconds(10) }); }); options.OnRejected = async (context, token) => { context.HttpContext.Response.StatusCode = 429; await context.HttpContext.Response.WriteAsync("Too many requests. Please try later again... ", cancellationToken: token); }; });
توجه داشته باشید که چگونه QueueProcessingOrder روی OldestFirst تنظیم شده است. اگر در عوض میخواهید آخرین موارد درج شده در صف ابتدا پردازش شوند، میتوانید QueueProcessingOrder را روی NewestFirst تنظیم کنید.
با استفاده از محدودیت نرخ، میتوانید بار روی سرور خود را کاهش دهید و از آن در برابر عوامل بد محافظت کنید و از در دسترس بودن سرویس خود و استفاده منصفانه از منابع موجود اطمینان حاصل کنید. در پستهای آینده در مورد محدود کردن نرخ، در مورد الگوریتمهای محدود کننده نرخ مختلف موجود در ASP.NET Core 7 و نحوه اجرای سیاستهای محدودیت نرخ سفارشی بحث خواهم کرد.
پست های مرتبط
با میان افزار محدود کننده نرخ در ASP.NET Core 7 شروع کنید
با میان افزار محدود کننده نرخ در ASP.NET Core 7 شروع کنید
با میان افزار محدود کننده نرخ در ASP.NET Core 7 شروع کنید