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

Боти скрейплять ваш API, копіюють каталог і перевантажують сервер, поки реальні клієнти потерпають від затримок. Ми розробляємо багаторівневий захист, що поєднує поведінковий аналіз, JA3-відбитки та honeypot-пастки. Наша команда реалізує проєкт під ключ — від аудиту до впровадження та подальшої підтримки, забезпечуючи надійну фільтрацію трафіку без сповільнення роботи для легітимних користувачів.

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

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

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

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

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

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

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

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060