چگونه می توان API های خود را با محدودیت نرخ محدود و محافظت کرد؟

API ستون فقرات برنامه های مدرن است و امکان برقراری ارتباط کارآمد بین مشتریان و سرورها را فراهم می کند. با این حال ، یک API محافظت نشده در برابر درخواست های بیش از حد می تواند قربانی حملات شود و منجر به تخریب عملکرد ، افزایش هزینه های زیرساخت یا حتی عدم دسترسی به این سرویس شود.
چرا محدود کننده نرخ مهم است؟
محدود کردن نرخ مکانیسم اساسی برای اطمینان از ثبات ، ایمنی و استفاده منصفانه از API است. این کمک می کند:
- جلوگیری از سوءاستفاده کاربران یا رباتها می تواند یک API را با درخواست ها اضافه کند ، و سعی در کشف آسیب پذیری ها یا سرنگونی سرویس دارد.
- کاهش هزینه های زیرساخت – ترافیک کنترل نشده می تواند هزینه های سرور را افزایش داده و مقیاس پذیری برنامه را تحت تأثیر قرار دهد.
- اطمینان از استفاده منصفانه – محدودیت ها مانع از انحصار منابع API ، توزیع بهتر بار می شود.
- حملات DDOS را کاهش دهید – با محدود کردن تعداد درخواست ها برای هر کاربر یا IP ، API در برابر حملات انکار مقاوم تر است.
از محدودیت نرخ استفاده می شود؟
محدودیت نرخ به طور گسترده در بخش های مختلف مانند:
- شبکه های اجتماعی – برای جلوگیری از سوء استفاده از اسپم و ربات (مثال: توییتر میزان توییت های ارسال شده در ساعت را محدود می کند).
- تجارت الکترونیکی-برای جلوگیری از بارگذاری صفحات محصول یا ابزارهای ردیابی قیمت ، از ربات ها جلوگیری می کند.
- خدمات مالی – برای محافظت از API های بانکی در برابر معاملات بیش از حد خودکار.
- برنامه های SaaS – برای تمایز برنامه های رایگان و پرداخت شده ، محدود کردن تعداد درخواست ها برای هر کاربر.
دستها
اجرای محدودیت نرخ در Fastapi با Redis
یک رویکرد متداول برای اجرای محدود کردن نرخ استفاده از REDIS به عنوان ذخیره سازی حافظه برای ردیابی درخواست های کاربر ، توکن یا IP است. FastAPI به میانه های آسان اجازه می دهد تا این محدودیت ها را به طور کارآمد اعمال کنند. ایده این است که قبل از انتقال به عملکرد اصلی خود ، درخواست را رهگیری کنید ، Middleware بررسی می کند که آیا جایی برای درخواست جدید وجود دارد ، در صورتی که به شما امکان می دهد ، اگر بلافاصله کد وضعیت 429 را “درخواست های زیادی” برگردانید.
با فرض اینکه از قبل FastAPI up & und را دارد:
pip install redis
بیایید کلاس Ratelimiter را ایجاد کنیم:
در این حالت من تصمیم گرفتم هر 1 دقیقه 10 پرش را محدود کنم. در پایان نتایج را نشان خواهم داد …
class RateLimiter:
"""
Rate Limiter para APIs.
Limita o número de requisições por usuário em um determinado intervalo de tempo
redis_client: Cliente Redis para armazenar os dados de rate limiting
max_requests: Número máximo de requisições permitidas
window: Intervalo de tempo em segundos
"""
def __init__(self, redis_client, max_requests=10, window=60):
self.redis = redis_client
self.max_requests = max_requests
self.window = window
def allow_request(self, user_id) -> bool:
"""Verifica se a requisição pode ser processada dentro do limite."""
now = time.time()
key = f"rate_limit:{user_id}"
pipe = self.redis.pipeline()
pipe.zadd(key, {now: now})
pipe.zremrangebyscore(key, 0, now - self.window)
pipe.zcard(key)
pipe.expire(key, self.window * 2)
_, _, request_count, _ = pipe.execute()
result = request_count <= self.max_requests
return result
پیکربندی برنامه (معمولاً در main.py یا app.py خود):
redis_client = redis.Redis(host="redis", port=6379, db=0)
ایجاد ظروف وسط
@app.middleware("http")
async def rate_limit_middleware(request: Request, call_next):
"""Middleware de rate limiting para todas as rotas"""
user_id = request.headers.get('X-User-ID', 'anonymous')
if not limiter.allow_request(user_id):
return JSONResponse(
status_code=429,
content={"message": "Limite de requisições excedido"}
)
response = await call_next(request)
return response
برای آزمایش ، فقط بی خوابی ، پستچی یا هر ابزاری را که می تواند بارها را شبیه سازی کند ، پیکربندی کنید!
در مورد ما در اینجا ، من از بی خوابی استفاده کردم! شواهد را دنبال کنید:
کد منبع در repo زیر است. می توانید از آن برای مطالعات و موارد مشابه استفاده کنید! استفاده از ملخ به عنوان تست بار در داخل پوشه وجود دارد load_test/
محدود کردن نرخ یک استراتژی کلیدی برای محافظت از API ها و اطمینان از استفاده متعادل و حفظ عملکرد است. با ادغام Redis با FastAPI ، توسعه دهندگان می توانند این محدودیت ها را به طور مؤثر اعمال کنند و API های خود را قوی تر و مقیاس پذیر تر کنند.
پیوندها و الهامات مفید: