סורק בודד יכול להפיל API שלם — 10,000 בקשות בשנייה מספיקות כדי למצות את משאבי השרת תוך 30 שניות. חסימה מבוססת IP פוגעת לעיתים קרובות במשתמשים לגיטימיים: 80% מההתקפות משתמשות במאגר כתובות, כך שסינון IP אינו יעיל. הגבלת קצב (Rate Limiting) פותרת זאת על ידי ניתוח IP, מזהה משתמש, מפתח API, נקודת קצה והיסטוריית בקשות. לדוגמה, עבור פלטפורמת פינטק יישמנו הגבלת קצב אדפטיבית — התקריות ירדו ב-90%, זמן התגובה הממוצע ירד ב-30%, וחוסכו 500$ מדי חודש על משאבי ענן. אנו פורסים מערכת רב-רמות שמתאימה את המגבלות באופן דינמי, ושומרת על זמינות ל-99% מהלקוחות גם במהלך התקפה. עם ניסיון של למעלה מ-5 שנים באבטחת API ויותר מ-50 יישומים מוצלחים, הצוות שלנו מבטיח הגנה חזקה.
למה שליטה רב-רמות?
רמה אחת מבוססת IP אינה מספיקה: סורקים יכולים להשתמש במאגר כתובות. אנו מציגים שלוש רמות: לפי משתמש (מאומת), לפי IP (אחרים), וגלובלית (הגנת DDoS). לדוגמה, במהלך התקפת הרשמה, אנו חוסמים IP אך משאירים משתמשים מאומתים ללא פגע — 99% מהתנועה הלגיטימית עוברת ללא עיכובים. הגישה הרב-רמות מפחיתה תוצאות חיוביות שגויות ב-80% וחוסכת עד 40% ממשאבי השרת. תצורת הגבלת הקצב שלנו כוללת Redis ואלגוריתמים אדפטיביים להגנת API מפני סורקים.
איך Sliding Window עובד ב-Redis
import redis
import time
from functools import wraps
r = redis.Redis(host='localhost', decode_responses=True)
def sliding_window_rate_limit(key: str, limit: int, window: int) -> bool:
"""
key: уникальный идентификатор (user_id, ip, api_key)
limit: макс. запросов за window секунд
window: размер окна в секундах
Возвращает True если запрос разрешён
"""
now = time.time()
window_start = now - window
pipe = r.pipeline()
pipe.zremrangebyscore(key, 0, window_start) # удалить старые записи
pipe.zadd(key, {str(now): now}) # добавить текущий запрос
pipe.zcard(key) # подсчитать в окне
pipe.expire(key, window) # TTL для cleanup
results = pipe.execute()
count = results[2]
return count <= limit
קוד זה משתמש ב-Redis Sorted Set כדי לאחסן חותמות זמן של בקשות. כל בקשה מתווספת עם ציון השווה לזמן הנוכחי. רשומות ישנות מוסרות, והספירה מושווה למגבלה.
השוואה: Token Bucket לעומת Sliding Window בפועל
| פרמטר | Token Bucket | Sliding Window |
|---|---|---|
| סובלנות לפרצי בקשות | כן, עד לגודל הדלי | כן, אך מוגבל לחלון |
| איפוס חלק | לא (מצטבר) | כן (רציף) |
| שימוש בזיכרון | מונה אחד | O(N) רשומות לכל חלון |
| שימוש אופייני | הגבלת רוחב פס | הגנה על נקודות קצה עם עומס משתנה |
Sliding Window מדויק פי שניים מ-Fixed Window בעומסי שיא ומספק הגבלה חלקה יותר.
הפחתת קצב אדפטיבית לפי סיכון
class AdaptiveRateLimiter:
def get_risk_score(self, request) -> float:
"""Оценить риск запроса от 0.0 (низкий) до 1.0 (высокий)"""
score = 0.0
# Подозрительный User-Agent
ua = request.headers.get('User-Agent', '')
if not ua or 'python-requests' in ua.lower() or 'curl' in ua.lower():
score += 0.3
# Нет заголовков браузера
if not request.headers.get('Accept-Language'):
score += 0.2
# Недавняя история ошибок (много 404, 401)
error_count = r.get(f"errors:{request.remote_addr}") or 0
if int(error_count) > 10:
score += 0.3
# Запросы с Tor/VPN IP (проверка по списку)
if self.is_known_proxy(request.remote_addr):
score += 0.2
return min(score, 1.0)
def get_effective_limit(self, base_limit: int, risk_score: float) -> int:
"""Снизить лимит для подозрительных клиентов"""
multiplier = 1.0 - (risk_score * 0.8) # до 80% снижения
return max(int(base_limit * multiplier), 1)
עבור לקוחות עם ציוני סיכון גבוהים, המגבלה יורדת עד 80% (בקשה אחת מתוך 5 מאושרת). זה ממשיך לספק שירות אך מגביל מאוד תוקפים.
אילו מדדים לנטר?
אנו משתלבים עם Prometheus/Grafana: עוקבים אחר בקשות שנדחו, עומס Redis, וזמן השהיה. כאשר חריגה מסף, מופעלת התראה ב-Telegram או ב-Slack. אנו ממליצים לנטר את יחס הבקשות שנדחו (לא יותר מ-5%) ואת זמן התגובה של Redis (מתחת ל-1 אלפית השנייה).
דוגמה לחישוב חיסכון בעלויות
עבור פרויקט עם 10 שרתי AWS בעלות של 2000$ לחודש, הגבלת קצב מפחיתה את העומס ב-30%, וחוסכת 600$ מדי חודש. היישום מתחיל ב-2,500$, עם החזר השקעה אופייני תוך 4 חודשים.טעויות נפוצות ביישום הגבלת קצב
- Fixed Window בנקודות קצה עם תעבורה גבוהה — גורם לקפיצות במגבלות בגבולות החלון. Sliding Window מבטל זאת.
- חוסר TTL למפתחות Redis — הצפת זיכרון. תמיד הגדר expire.
- מגבלות מבוססות IP בלבד — לא יעילות נגד התקפות מבוזרות. השתמש בשליטה רב-רמות.
- התעלמות מכותרות X-RateLimit — לקוחות לא יכולים להסתגל. הוסף כותרות לפי RFC 6585.
Redis לעומת In-memory להגבלת קצב
| קריטריון | Redis | In-memory |
|---|---|---|
| שמירה לאחר אתחול | כן (RDB/AOF) | לא |
| קנה מידה | שכפול מובנה | דורש מנגנון חיצוני |
| מהירות | <1 אלפית השנייה | <0.1 אלפית השנייה |
| מורכבות יישום | נמוכה (ספריות) | בינונית (סנכרון צמתים) |
Redis מספק קנה מידה פי 10 טוב יותר מפתרונות in-memory עבור מערכות מבוזרות.
תהליך היישום ולוח זמנים
שלבי היישום
- ביקורת API נוכחית — ניתוח נקודות קצה, סוגי לקוחות, עומסי שיא. קביעת קו בסיס (לדוגמה, 1000 בקשות לשנייה עבור נקודות קצה ציבוריות).
- עיצוב מדיניות — הגדרת מגבלות לכל נקודת קצה ורמות בקרה.
- יישום — כתיבת middleware, חיבור Redis, הגדרת בדיקה רב-רמות.
- בדיקות — בדיקות עומס עם תרחישים מדומים (גירוד ב-10,000 בקשות לשנייה, DDoS, פעולה רגילה).
- פריסה וניטור — פריסה לשרתי staging, ולאחר מכן לייצור, הגדרת התראות.
לוחות זמנים משוערים
יישום בסיסי עם Redis Sliding Window ומגבלות רב-רמות אורך 1–2 ימי עבודה. יישום מלא עם ניקוד אדפטיבי ושילוב Kong — עד 5 ימים. אנו מספקים הערכה מדויקת לאחר ביקורת ה-API שלך.
מה אתה מקבל ואיך להתחיל
במסגרת העבודה, אתה מקבל קוד עם decorators ו-middleware (Python/Node.js/PHP — לפי המחסן הטכנולוגי שלך), תיעוד פריסה ותצורה, שילוב עם התשתית הקיימת (Redis, Kong, Nginx), הגדרת ניטור והתראות, והדרכת צוות. אנו מבטיחים יציבות לחודש לאחר ההשקה.
אנו מציעים פתרון סוהר: קוד, פריסה והדרכה. צור קשר לביקורת של ה-API שלך. נעריך את העומס ונציע תצורה אופטימלית. הזמן יישום וקבל הגנה יציבה תוך מספר ימים. קבל ייעוץ היום — נסביר כיצד הגבלת קצב אדפטיבית פותרת את הבעיות שלך. השירות שלנו כולל הכל: קוד, פריסה, ניטור ותמיכה.







