Тема
Режим
Язык
Тема
Режим
Язык
Регистрация
FREE Бесплатный аудит сайта за 15 мин Заказать →

HTTP Flood: как отличить ботов от реальных пользователей

HTTP Flood маскируется под легитимный трафик. Защита строится на анализе поведения: fingerprinting, rate limiting, JavaScript challenges, ML-классификация.

Executive Summary для руководителя
💰

Финансовый риск

От 50 000 до 300 000 рублей в час из-за недоступности сайта для клиентов при атаке на прикладном уровне (L7), перерасхода ресурсов CPU/RAM хостинга.

📈

Влияние на KPI

Снижение конверсии заказов. Медленный отклик сайта (TTFB) ухудшает поведенческие факторы и пессимизирует поисковый трафик из Google и Яндекса.

⚠️

Уровень критичности

Высокий

👤

Кому поручить

DevOps-инженер / Бэкенд-разработчик

TL;DR: HTTP Flood маскируется под легитимный трафик. Защита строится на анализе поведения: fingerprinting, rate limiting, JavaScript challenges, ML-классификация.

Время чтения: 14 мин | Уровень: Продвинутый


01

Почему HTTP Flood сложнее SYN Flood

SYN Flood легко детектить: аномальные паттерны на L4, spoofed IP. HTTP Flood — это валидные TCP-соединения с валидными HTTP-запросами. Атакующий использует реальные браузеры или продвинутые боты.

ХарактеристикаSYN FloodHTTP Flood
УровеньL4 (TCP)L7 (HTTP)
IP-адресаSpoofedРеальные (прокси/резидентные)
СоединенияНе завершаютсяПолноценные
ДетекцияПростаяСложная
БлокировкаПо IP/rateПоведенческая

Типы HTTP Flood

┌─────────────────────────────────────────────────────────────┐
│                    HTTP FLOOD TAXONOMY                       │
├──────────────────┬──────────────────┬───────────────────────┤
│   GET Flood      │   POST Flood     │   Slowloris / Slow    │
│                  │                  │   POST                │
├──────────────────┼──────────────────┼───────────────────────┤
│ Простые GET      │ POST с payload   │ Держит соединения     │
│ на тяжёлые       │ на формы,        │ открытыми, медленно   │
│ эндпоинты        │ API, загрузку    │ отправляя данные      │
├──────────────────┼──────────────────┼───────────────────────┤
│ /search?q=*      │ /api/upload      │ Connection: keep-alive│
│ /catalog?page=   │ /login           │ Content-Length: big   │
│ /export?format=  │ /checkout        │ ... slow body ...     │
└──────────────────┴──────────────────┴───────────────────────┘

02

Признаки HTTP Flood в логах

Что искать в access.log

# Топ IP по количеству запросов (последний час)
awk -v date="$(date '+%d/%b/%Y:%H' -d '1 hour ago')" \
  '$4 ~ date {print $1}' /var/log/nginx/access.log | \
  sort | uniq -c | sort -rn | head -20

# Если один IP делает > 1000 req/min — подозрительно
# Запросы без User-Agent или с подозрительными
grep -E '"[^"]*" "-"' /var/log/nginx/access.log | wc -l
grep -i 'python\|curl\|wget\|scanner' /var/log/nginx/access.log | wc -l
# Аномальное распределение по эндпоинтам
awk '{print $7}' /var/log/nginx/access.log | \
  sort | uniq -c | sort -rn | head -10

# Если 90% трафика на один URL — атака или проблема

Паттерны ботов vs людей

Сравнение решений

Сигнал Человек Бот
Время между запросами Случайное (2-30 сек) Фиксированное (100ms)
Mouse movement Да Нет
JS execution Да Часто нет
Cookie support Да Часто нет
Referer chain Логичный Отсутствует или прямой
Session depth 5-20 страниц 1-2 страницы
Screen resolution Типичные (1920x1080 390x844)

* Бесплатный план — базовая поддержка. Полная 24/7 поддержка на Pro+ тарифах.


03

Многоуровневая защита

Уровень 1: Rate Limiting

# nginx.conf

# Зоны для разных типов лимитов
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr$uri zone=uri_limit:10m rate=5r/s;
limit_req_zone $http_authorization zone=api_limit:10m rate=100r/s;

# Лимит соединений
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    # Общий лимит: 10 req/s с burst 20
    limit_req zone=ip_limit burst=20 nodelay;
    
    # Лимит соединений: max 50 с одного IP
    limit_conn conn_limit 50;
    
    # Для API — отдельный лимит по токену
    location /api/ {
        limit_req zone=api_limit burst=50;
    }
    
    # Для тяжёлых эндпоинтов — строже
    location /search {
        limit_req zone=uri_limit burst=5;
    }
    
    location /export {
        limit_req zone=uri_limit burst=2;
    }
}

Уровень 2: JavaScript Challenge

Простые боты не выполняют JavaScript. Идея: отдать challenge, проверить решение.

<!-- Простой challenge (не для продакшена, для понимания) -->
<script>
  // Вычислить и отправить proof-of-work
  const challenge = document.body.dataset.challenge;
  let nonce = 0;
  
  async function solve() {
    while (true) {
      const hash = await sha256(challenge + nonce);
      if (hash.startsWith('0000')) {
        // Отправить решение
        document.cookie = `pow=${nonce}; path=/`;
        location.reload();
        return;
      }
      nonce++;
    }
  }
  solve();
</script>

Production-решения:

  • Cloudflare JS Challenge / Managed Challenge
  • AWS WAF Bot Control
  • Imperva Advanced Bot Protection
  • Собственный CAPTCHA (reCAPTCHA / hCaptcha / Turnstile)

Уровень 3: Fingerprinting

// Собираем fingerprint браузера
const fp = {
  // Canvas fingerprint
  canvas: getCanvasFingerprint(),
  
  // WebGL renderer
  webgl: getWebGLRenderer(),
  
  // Fonts
  fonts: detectFonts(),
  
  // Screen
  screen: `${screen.width}x${screen.height}x${screen.colorDepth}`,
  
  // Timezone
  tz: Intl.DateTimeFormat().resolvedOptions().timeZone,
  
  // Language
  lang: navigator.language,
  
  // Platform
  platform: navigator.platform,
  
  // Hardware concurrency
  cores: navigator.hardwareConcurrency,
  
  // Device memory
  memory: navigator.deviceMemory,
  
  // Touch support
  touch: 'ontouchstart' in window,
};

// Hash и отправить на сервер
const hash = sha256(JSON.stringify(fp));

Что даёт fingerprint:

  • Группировка запросов по реальным устройствам
  • Детекция эмуляторов (PhantomJS, Selenium)
  • Обнаружение Headless Chrome (специфичные признаки)
  • Rate limiting по device, а не по IP

Уровень 4: Поведенческий анализ

# Пример ML-модели для классификации (псевдокод)

features = [
    'requests_per_minute',
    'unique_urls_ratio',
    'avg_time_on_page',
    'mouse_events_per_request',
    'scroll_depth',
    'js_execution_time',
    'cookie_acceptance',
    'session_duration',
    'referer_chain_length',
    'request_timing_variance',  # Ключевой признак
]

# Variance of timing — главный сигнал
# Люди: высокая вариативность (std > 5 сек)
# Боты: низкая вариативность (std < 0.5 сек)

def is_bot(session_data):
    timing_std = np.std(session_data['request_intervals'])
    if timing_std < 0.5:
        return True  # Слишком ритмично — бот
    
    if session_data['js_executed'] == False:
        return True  # Не выполнил JS — бот
    
    if session_data['mouse_events'] == 0:
        return True  # Нет mouse events — бот
    
    # Для остального — ML модель
    return model.predict(extract_features(session_data)) > 0.7

04

Архитектура защиты

                    ┌──────────────────────────────────┐
                    │         Входящий трафик          │
                    │         (100% requests)          │
                    └────────────────┬─────────────────┘
                                     │
                                     ▼
┌────────────────────────────────────────────────────────────┐
│  CDN / Edge (Cloudflare, Fastly)                           │
│  ├── Кеширование статики                                   │
│  ├── Rate limiting L7                                      │
│  ├── Managed Bot Challenge                                 │
│  └── IP reputation scoring                                 │
│                                                            │
│  Пропускает: ~60% (кешированные + прошедшие challenge)     │
└────────────────────────────┬───────────────────────────────┘
                             │ 40%
                             ▼
┌────────────────────────────────────────────────────────────┐
│  WAF (ModSecurity / AWS WAF / собственный)                 │
│  ├── Сигнатурные правила (SQL injection, XSS)              │
│  ├── Rate limiting по session/fingerprint                  │
│  └── Блокировка известных bad actors                       │
│                                                            │
│  Пропускает: ~25%                                          │
└────────────────────────────┬───────────────────────────────┘
                             │ 25%
                             ▼
┌────────────────────────────────────────────────────────────┐
│  Application Layer                                         │
│  ├── Fingerprinting в middleware                           │
│  ├── Session scoring                                       │
│  ├── Behavioral analysis                                   │
│  └── Business-logic rate limits (per user, per action)     │
│                                                            │
│  Пропускает: ~20% (легитимные пользователи)                │
└────────────────────────────┬───────────────────────────────┘
                             │ 20%
                             ▼
┌────────────────────────────────────────────────────────────┐
│  Backend / Database                                        │
│  ├── Query optimization                                    │
│  ├── Caching (Redis)                                       │
│  └── Circuit breakers                                      │
└────────────────────────────────────────────────────────────┘

05

Практический пример: защита API

# FastAPI middleware для защиты от HTTP Flood

from fastapi import FastAPI, Request, HTTPException
from collections import defaultdict
import time
import hashlib

app = FastAPI()

# Хранилище rate limiting (в продакшене — Redis)
request_counts = defaultdict(list)
fingerprints = defaultdict(set)

def get_client_fingerprint(request: Request) -> str:
    """Генерирует fingerprint клиента"""
    data = f"{request.headers.get('user-agent', '')}" \
           f"{request.headers.get('accept-language', '')}" \
           f"{request.headers.get('accept-encoding', '')}"
    return hashlib.sha256(data.encode()).hexdigest()[:16]

def check_rate_limit(client_id: str, limit: int = 100, window: int = 60) -> bool:
    """Проверяет rate limit"""
    now = time.time()
    # Очищаем старые записи
    request_counts[client_id] = [
        t for t in request_counts[client_id] 
        if now - t < window
    ]
    # Проверяем лимит
    if len(request_counts[client_id]) >= limit:
        return False
    request_counts[client_id].append(now)
    return True

def detect_timing_anomaly(client_id: str) -> bool:
    """Детектирует подозрительно ритмичные запросы"""
    times = request_counts.get(client_id, [])
    if len(times) < 10:
        return False
    
    intervals = [times[i+1] - times[i] for i in range(len(times)-1)]
    variance = sum((x - sum(intervals)/len(intervals))**2 for x in intervals) / len(intervals)
    
    # Низкая вариативность = бот
    return variance < 0.01

@app.middleware("http")
async def anti_flood_middleware(request: Request, call_next):
    client_ip = request.client.host
    fingerprint = get_client_fingerprint(request)
    client_id = f"{client_ip}:{fingerprint}"
    
    # Rate limiting
    if not check_rate_limit(client_id, limit=100, window=60):
        raise HTTPException(status_code=429, detail="Too many requests")
    
    # Timing anomaly detection
    if detect_timing_anomaly(client_id):
        raise HTTPException(status_code=403, detail="Suspicious activity")
    
    # Проверка User-Agent
    ua = request.headers.get('user-agent', '')
    if not ua or len(ua) < 10:
        raise HTTPException(status_code=403, detail="Invalid User-Agent")
    
    response = await call_next(request)
    return response

06

Чек-лист защиты от HTTP Flood

Чек-лист готовности

0 / 8

07

Что дальше?

HTTP Flood — часть более широкой темы L7-защиты:

Сложно разобраться? Закажите аудит защиты →


  • Последнее обновление: февраль 2026*
08

Практическая экспертиза AntiDDoS.su

📝
Заметка

Практическая экспертиза AntiDDoS.su Этот материал подготовлен инженерами безопасности AntiDDoS.su. Мы специализируемся на отражении распределенных атак любой сложности, аудите безопасности инфраструктуры и настройке отказоустойчивых систем. 🛡️ Важная информация: Если ваш ресурс находится под атакой или нуждается в профессиональном аудите защиты — обратитесь к экспертам AntiDDoS.su для оперативной помощи.


Чек-лист проверки для владельца бизнеса

Скопируйте эти вопросы и отправьте вашему техническому директору (CTO) или руководителю разработки:

  • Настроена ли WAF-фильтрация для отсечения ботов с помощью JS-челленджей без показа капчи реальным пользователям?
  • Защищен ли веб-сервер от атак типа Slowloris путем оптимизации HTTP Keep-Alive таймаутов?
  • Проверено ли наше приложение на защиту от атак типа HTTP Request Smuggling и отравления кэша?

Словарь по теме

Bot Management

Система идентификации и блокировки автоматизированного трафика при сохранении доступа для легитимных пользователей.

Fingerprinting

Технология идентификации посетителя по уникальным характеристикам браузера и устройства без cookies. Используется для обнаружения ботов.

IP Reputation

Оценка надёжности IP-адреса на основе истории его активности — участие в атаках, спаме, вредоносной деятельности.

Rate Limiting

Ограничение количества запросов с одного IP-адреса за определённый период времени. Первая линия защиты от ботов, брутфорса и простых DDoS-атак.

SQL-инъекция

Атака через внедрение вредоносного SQL-кода в запросы к базе данных. Позволяет получить несанкционированный доступ к данным или изменить их.

ModSecurity

Open-source WAF для Apache и nginx. Фильтрует вредоносные запросы по правилам OWASP Core Rule Set.

User-Agent

HTTP-заголовок, идентифицирующий браузер или программу. Боты часто имеют пустой или подозрительный User-Agent.

Cloudflare

Популярный сервис CDN и защиты от DDoS. Бесплатный план включает базовую защиту, SSL, и ускорение загрузки через глобальную сеть из 300+ дата-центров.

Получите план защиты под ваш сайт

Оставьте контакт и адрес сайта — пришлём план защиты и список приоритетных шагов.

  • Приоритетные шаги на 7 дней
  • Быстрая обратная связь
  • План в удобном формате
Без спама. Можно указать Telegram (@username) или email.
Написать в Telegram