Захист API від ботів: поведінковий аналіз, JA3 та honeypot

Одного разу наш клієнт — інтернет-магазин з каталогом 50 000 товарів — виявив, що конкурент за 3 години скопіював весь асортимент за допомогою простого Python-скрипта (використовував `aiohttp` і пул з 200 проксі). Навантаження на сервер зросло вдвічі, легітимні користувачі скаржилися на затримки. Ми

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Захист API від ботів: поведінковий аналіз, JA3 та honeypot
Складний
~3-5 днів

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1418
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1286
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    983
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1243
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    998

Одного разу наш клієнт — інтернет-магазин з каталогом 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 кроків

  1. Аудит поточного API та визначення критичних ендпоінтів.
  2. Вибір стеку: Python + Redis + nginx для JA3 fingerprint.
  3. Реалізація поведінкового детектора (див. код нижче).
  4. Інтеграція honeypot та CAPTCHA (Cloudflare Turnstile).
  5. Моніторинг через 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.