Одного разу наш клієнт — інтернет-магазин з каталогом 50 000 товарів — виявив, що конкурент за 3 години скопіював весь асортимент за допомогою простого Python-скрипта (використовував aiohttp і пул з 200 проксі). Навантаження на сервер зросло вдвічі, легітимні користувачі скаржилися на затримки. Ми впровадили багаторівневий захист, який блокує 99% ботів, не сповільнюючи реальних клієнтів. У підсумку навантаження знизилося на 40%, а час відповіді API повернувся до початкових 50 мс.
Згідно з дослідженням Imperva, боти становлять понад 40% інтернет-трафіку, і без захисту ваш API вразливий.
Проблема: чому простий rate limiting не працює
IP-based rate limiting легко обходиться пулом адрес. Боти можуть імітувати людський ритм запитів. Потрібен аналіз поведінкових патернів, заголовків і навіть TLS-відбитків. Тільки комбінація методів дає надійний захист. Поведінковий аналіз виявляє в 3 рази більше ботів, ніж просте IP-блокування.
Як ми вирішуємо: багатошарова защита
Кожен шар відсіває частину трафіку:
Клієнт → WAF (IP репутація) → Rate Limiting → Bot Detection → API Logic
↓
Fingerprint + Behavioral Analysis + CAPTCHA
Жоден метод окремо не ідеальний — ми комбінуємо їх для максимальної ефективності. Отримайте консультацію інженера з досвідом понад 10 років для оцінки вашого проекту.
Які сигнали видають бота?
| Сигнал | Вага | Опис |
|---|---|---|
User-Agent відсутній / curl / python-requests |
+40 | Типові автоматичні клієнти |
Немає Accept-Language / Accept-Encoding |
+20 | Браузер завжди надсилає ці заголовки |
| Запити строго кожні N мс | +35 | Людина не може так точно |
| Однаковий патерн URL (послідовний обхід) | +30 | ?page=1, ?page=2... |
| Немає Referer при навігації | +15 | Браузер зазвичай передає |
| Декілька запитів з одного IP-діапазону | +25 | Розподілений бот |
| TLS fingerprint (JA3) нетиповий | +30 | Node.js/Python TLS відрізняється від браузера |
Порівняння методів захисту
| Метод | Переваги | Недоліки |
|---|---|---|
| Rate limiting | Простота | Не ефективний проти пулів IP |
| Поведінковий аналіз | Висока точність | Вимагає Redis, більше ресурсів |
| JA3 fingerprint | Важко підробити | Не всі проксі передають fingerprint |
| Honeypot | Нульове навантаження | Виявляється ботами середнього рівня |
| CAPTCHA | Висока надійність | Погіршує UX, не завжди застосовний для API |
Ми комбінуємо поведінковий аналіз з JA3 та honeypot. Такий набір дає найкращий баланс точності та продуктивності.
Чому поведінковий аналіз ефективніший за rate limiting?
Поведінковий аналіз враховує не лише частоту, а й якісні ознаки: відсутність браузерних заголовків, машинну точність інтервалів, послідовний обхід URL. Навіть якщо бот використовує розподілені IP, його видає поведінка. На практиці це дозволяє знизити кількість хибних спрацьовувань на 80% порівняно з чистим rate limit.
Як впровадити захист за 5 кроків
- Аудит поточного API та визначення критичних ендпоінтів.
- Вибір стеку: Python + Redis + nginx для JA3 fingerprint.
- Реалізація поведінкового детектора (див. код нижче).
- Інтеграція honeypot та CAPTCHA (Cloudflare Turnstile).
- Моніторинг через Prometheus та Grafana.
Ми допомагаємо на кожному етапі, гарантуючи відсутність хибних спрацьовувань.
Як працює поведінковий аналіз?
Детектор на основі поведінкових ознак обчислює score від 0 до 100 за декількома критеріями. Ось ключова реалізація:
import time
import statistics
from collections import defaultdict, deque
class BotDetector:
def __init__(self, redis_client):
self.r = redis_client
self.window = 300 # 5-хвилинне вікно аналізу
def analyze_request(self, request) -> dict:
"""Повертає score (0-100) та причини підозри"""
score = 0
reasons = []
# 1. Заголовки браузера
headers = request.headers
ua = headers.get('User-Agent', '')
bot_uas = ['python-requests', 'curl', 'wget', 'Go-http-client',
'Java/', 'okhttp', 'axios', 'node-fetch']
for bot_ua in bot_uas:
if bot_ua.lower() in ua.lower():
score += 40
reasons.append(f'bot_useragent:{bot_ua}')
break
if not ua:
score += 40
reasons.append('no_useragent')
if not headers.get('Accept-Language'):
score += 20
reasons.append('no_accept_language')
if not headers.get('Accept-Encoding'):
score += 15
reasons.append('no_accept_encoding')
# 2. Аналіз частоти запитів
ip = request.remote_addr
timing_score = self._analyze_timing(ip)
if timing_score > 0:
score += timing_score
reasons.append(f'suspicious_timing:{timing_score}')
# 3. Патерн URL (послідовний обхід)
path = request.path
pattern_score = self._analyze_url_pattern(ip, path)
if pattern_score > 0:
score += pattern_score
reasons.append(f'url_pattern:{pattern_score}')
# 4. JA3 TLS fingerprint (через nginx змінну)
ja3 = headers.get('X-JA3-Fingerprint')
if ja3 and self._is_suspicious_ja3(ja3):
score += 30
reasons.append(f'suspicious_ja3:{ja3[:16]}')
return {
'score': min(score, 100),
'is_bot': score >= 60,
'reasons': reasons,
'action': self._get_action(score)
}
def _analyze_timing(self, ip: str) -> int:
"""Аналіз інтервалів між запитами"""
key = f"timing:{ip}"
now = time.time()
self.r.lpush(key, now)
self.r.ltrim(key, 0, 49)
self.r.expire(key, self.window)
timestamps = [float(t) for t in self.r.lrange(key, 0, -1)]
if len(timestamps) < 5:
return 0
timestamps.sort()
intervals = [timestamps[i+1] - timestamps[i] for i in range(len(timestamps)-1)]
if not intervals:
return 0
avg = statistics.mean(intervals)
stdev = statistics.stdev(intervals) if len(intervals) > 1 else 0
cv = stdev / avg if avg > 0 else 0
if cv < 0.05 and avg < 2.0:
return 35
if cv < 0.15 and avg < 1.0:
return 25
return 0
def _analyze_url_pattern(self, ip: str, path: str) -> int:
"""Виявлення послідовного обходу"""
key = f"paths:{ip}"
self.r.lpush(key, path)
self.r.ltrim(key, 0, 19)
self.r.expire(key, self.window)
paths = self.r.lrange(key, 0, -1)
if len(paths) < 5:
return 0
import re
numeric_pattern = re.compile(r'/(\d+)$')
numbers = [int(m.group(1)) for p in paths if (m := numeric_pattern.search(p.decode()))]
if len(numbers) >= 5:
diffs = [numbers[i] - numbers[i+1] for i in range(len(numbers)-1)]
if all(d == diffs[0] for d in diffs) and abs(diffs[0]) in [1, -1]:
return 30
return 0
def _is_suspicious_ja3(self, ja3: str) -> bool:
SUSPICIOUS_JA3 = {
'e7d705a3286e19ea42f587b344ee6865', # Python requests
'b386946a5a44d1ddcc843bc75336dfce', # Scrapy
'6734f37431670b3ab4292b8f60f29984', # Go default
}
return ja3.lower() in SUSPICIOUS_JA3
def _get_action(self, score: int) -> str:
if score < 30: return 'allow'
if score < 60: return 'challenge'
if score < 80: return 'throttle'
return 'block'
Додаткові заходи при обході CAPTCHA
Обхід CAPTCHA рідкісний, але ми додаємо honeypot і JA3 для посилення. Honeypot — приховані ендпоінти, які відвідують лише боти. Ми додаємо /api/items/all (не існує для користувачів) і чорний список IP при зверненні. CAPTCHA використовуємо лише при score >= 60, щоб не заважати звичайним користувачам. Інтеграція з Cloudflare Turnstile прозора для реальних клієнтів.
@app.route('/api/search')
def search():
if g.get('bot_score', 0) >= 60:
token = request.headers.get('CF-Turnstile-Token')
if not verify_turnstile(token):
return jsonify({'error': 'CAPTCHA required', 'captcha_site_key': TURNSTILE_SITE_KEY}), 429
q = request.args.get('q', '')
return jsonify(search_service.query(q))
Приклад honeypot-ендпоінта:
@app.route('/api/items/all')
def honeypot_endpoint():
ip = request.remote_addr
bot_detector.blacklist_ip(ip, duration=86400, reason='honeypot')
return jsonify({'items': [], 'total': 0})
Що входить в роботу
- Аудит поточного API та вразливостей
- Реалізація поведінкового детектора (BotDetector)
- Інтеграція з Redis та middleware (Flask/Django/Express)
- Налаштування nginx для передачі JA3 fingerprint
- Створення honeypot-ендпоінтів та системи CAPTCHA
- Дашборд метрик (Prometheus + Grafana) для моніторингу
- Документація та навчання команди
- Технічна підтримка 2 тижні після запуску
Орієнтовні строки
Реалізація багаторівневого захисту займає від 5 до 10 робочих днів залежно від складності API. Вартість розраховується індивідуально — оцінимо проект після аналізу. Клієнти економлять значні кошти після впровадження захисту. Інвестиція в захист окупається за 2-3 місяці.
Замовте аудит захисту API вже сьогодні. Отримайте консультацію інженера з досвідом понад 10 років у веб-розробці та експлуатації високонавантажених систем.
Детальніше про Web scraping.







