Asosiy kontentga o‘tish

Maqolalar

Darslik · 2026-01-18 · ~2 daqiqa o‘qiladi · o'rta

Rate limiting: API'ni suiiste'moldan himoyalash

#backend #security #api

Mundarija

API ochiq bo‘lsa, kimdir undan haddan tashqari foydalanadi — bilib yoki bilmay. Rate limiting har bir mijozga vaqt birligida nechta so‘rov yuborishni cheklaydi. Bu ham xavfsizlik (brute-force himoyasi), ham barqarorlik masalasi.

Nega kerak#

  • Brute-force himoyasi — login sahifasiga soniyasiga 1000 urinish qila olmaydi
  • Resurslarni himoyalash — bitta mijoz butun serverni band qilib qo‘ymaydi
  • Adolatli taqsimot — hamma foydalanuvchiga barobar imkoniyat

Token bucket algoritmi#

Eng keng tarqalgan usul. Har mijozda "chelak" bor, unda tokenlar. Har so‘rov bitta token sarflaydi, tokenlar vaqt bilan to‘ldiriladi. Chelak bo‘shasa — so‘rov rad etiladi.

Redis bilan sodda amalga oshirish:

def is_allowed(user_id, limit=10, window=60):
    key = f"rate:{user_id}"
    current = redis.incr(key)
    if current == 1:
        redis.expire(key, window)  # oynani boshla
    return current <= limit

Bu — daqiqasiga (60s) 10 so‘rov. 11-so‘rov False qaytaradi.

HTTP javobda to‘g‘ri xabar berish#

Chegara oshganda 429 Too Many Requests qaytaring va qachon qayta urinish mumkinligini ayting:

if not is_allowed(user_id):
    return JsonResponse(
        {"error": "Juda ko‘p so‘rov. Biroz kuting."},
        status=429,
        headers={"Retry-After": "60"},
    )

Amaliy maslahatlar#

  • Login va parol tiklash kabi sezgir endpointlarga qattiqroq chegara qo‘ying.
  • Chegarani IP + foydalanuvchi bo‘yicha hisoblang — faqat IP yetarli emas (bitta NAT ortida ko‘p foydalanuvchi bo‘lishi mumkin).
  • Production'da tayyor yechim ishlating: Nginx limit_req, yoki Django uchun django-ratelimit.

Rate limiting — kichik kod, katta himoya. Har bir ommaviy API'da bo‘lishi shart.