Финансовый риск
От 50 000 до 300 000 рублей в час из-за недоступности сайта для клиентов при атаке на прикладном уровне (L7), перерасхода ресурсов CPU/RAM хостинга.
Влияние на KPI
Снижение конверсии заказов. Медленный отклик сайта (TTFB) ухудшает поведенческие факторы и пессимизирует поисковый трафик из Google и Яндекса.
Уровень критичности
Высокий
Кому поручить
DevOps-инженер / Бэкенд-разработчик
TL;DR: HTTP Flood маскируется под легитимный трафик. Защита строится на анализе поведения: fingerprinting, rate limiting, JavaScript challenges, ML-классификация.
Время чтения: 14 мин | Уровень: Продвинутый
Почему HTTP Flood сложнее SYN Flood
SYN Flood легко детектить: аномальные паттерны на L4, spoofed IP. HTTP Flood — это валидные TCP-соединения с валидными HTTP-запросами. Атакующий использует реальные браузеры или продвинутые боты.
| Характеристика | SYN Flood | HTTP 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 ... │
└──────────────────┴──────────────────┴───────────────────────┘
Признаки 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 людей
Многоуровневая защита
Уровень 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
Архитектура защиты
┌──────────────────────────────────┐
│ Входящий трафик │
│ (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 │
└────────────────────────────────────────────────────────────┘
Практический пример: защита 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
Чек-лист защиты от HTTP Flood
Что дальше?
HTTP Flood — часть более широкой темы L7-защиты:
- 📖 Rate Limiting: защита API
- 📖 Slowloris: атака на соединения
- 📖 WAF: полный гайд
- 🔍 Bot Management в глоссарии
- 🔍 L7 атаки в глоссарии
Сложно разобраться? Закажите аудит защиты →
- Последнее обновление: февраль 2026*
Практическая экспертиза 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+ дата-центров.