
Автоматизированный инструмент оценки WAF, который определяет производителей брандмауэров, тестирует 19 категорий атак с использованием продвинутых обходных полезных нагрузок и предоставляет цветовой анализ обхода через CLI, Cloudflare Worker или Docker.
# WAF Checker
[](https://github.com/SecH0us3/waf-checker/releases)
[](https://github.com/SecH0us3/waf-checker/releases)
[](packages/core)
[](packages/cli)
[]()
Этот проект помогает проверить, насколько хорошо ваш Web Application Firewall (WAF) защищает ваш продукт от распространённых веб-атак. Его можно запускать как Cloudflare Worker (со встроенным интерактивным веб-интерфейсом) или как автономный CLI-инструмент Node.js.
## 🧪 Покрытие тестами и статус
Все пакеты тщательно протестированы с помощью автоматизированных наборов модульных, интеграционных тестов, тестов на основе свойств (фаззинг fast-check), тестов на устойчивость к сетевым сбоям и тестов на обратную разработку (100% соответствие требованиям безопасности SSRF, методы обхода протоколов и средства форматирования отчётов):
| Пакет | Покрытие строк | Операторы | Функции | Набор тестов |
| :--- | :---: | :---: | :---: | :---: |
| [**`@waf-checker/core`**](https://github.com/sech0us3/waf-checker/blob/main/packages/core) | `93.0%` 🟢 | `92.6%` | `96.4%` | 🟢 282 проходят |
| [**`@waf-checker/cli`**](https://github.com/sech0us3/waf-checker/blob/main/packages/cli) | `93.5%` 🟢 | `92.8%` | `96.7%` | 🟢 54 проходят |
| [**`@waf-checker/worker`**](https://github.com/sech0us3/waf-checker/blob/main/packages/worker) | `Проходят` 🟢 | — | — | 🟢 30 проходят |
| **Всего по монорепозиторию** | **`93.2%`** | **`92.7%`** | **`96.6%`** | **🟢 366 тестов проходят** |
## Возможности
### Основное тестирование
- Введите целевой URL, выберите HTTP-методы (GET, POST и т. д.) и категории атак.
- Отправляет запросы с полезными нагрузками атак (в параметрах, заголовках или в виде путей к файлам).
- Цветовая маркировка результатов в терминале и веб-интерфейсе: 🟢 403/BLOCKED = заблокировано, 🔴 2xx/5xx = возможный обход, 🟠 3xx = перенаправление.
- Результаты отображаются в фильтруемой таблице с подробностями для каждой полезной нагрузки.
### 🕵️ Обратная разработка WAF и матрица CRS (`--reverse`)
- **Сопоставление с OWASP Core Rule Set (CRS v3/v4)**: Аудит активных и отключённых идентификаторов правил (`920xxx`, `921xxx`, `930xxx`, `931xxx`, `932xxx`, `933xxx`, `934xxx`, `941xxx`, `942xxx`, `943xxx`, `944xxx`) с уровнями паранойи (PL1-PL4).
- **Обнаружение ограничения размера тела запроса при инспекции**: Бинарный поиск (8 КБ – 128 КБ, точность ~1 КБ) для определения границ усечения буфера.
- **Обнаружение режима оценки аномалий**: Проверяет совместный режим оценки в сравнении со строгим режимом блокировки по регулярным выражениям и определяет пороговые значения оценки.
- **Безопасное зондирование ограничения частоты запросов**: Безопасное постепенное увеличение до 30 запросов/с с немедленным досрочным прекращением при получении HTTP 429 и извлечением `Retry-After`.
### 🛡️ Виртуальное патчинг WAF и автоматическое устранение (`--patch` / команда `patch`)
- **Мгновенное устранение**: автоматически преобразует обнаруженные обходы WAF (HTTP 200) в готовые к развёртыванию правила межсетевого экрана, конфигурации обратного прокси и Infrastructure-as-Code (Terraform HCL / Cloud CLI).
- **Поддерживаемые платформы (11 диалектов)**:
- **Cloudflare WAF**: выражения Wirefilter (`http.request.uri.query contains ...` / `matches ...`) и Terraform HCL `cloudflare_ruleset`.
- **AWS WAF v2**: нативные JSON Rule Statements (`ByteMatchStatement`, `RegexPatternSet`, `OrStatement`) и Terraform HCL `aws_wafv2_rule_group`.
- **Google Cloud Armor**: выражения CEL (`request.path.matches(...)`, `request.headers[...]`), CLI-команды `gcloud compute security-policies` и Terraform `google_compute_security_policy`.
- **Azure WAF (Front Door и App Gateway)**: JSON-определения Custom Rule, CLI-команды `az network front-door waf-policy` и Terraform `azurerm_cdn_frontdoor_firewall_policy`.
- **ModSecurity и OWASP Coraza**: директивы `SecRule` (SecLang), совместимые с OWASP CRS, со свёртыванием токенов `@pm`. Поддерживается через `--patch modsecurity` или `--patch coraza`.
- **NGINX**: нативные блоки конфигурации `location ~* \.(ext)$ { return 403; }`, `location ~ /\.(git|svn)` и `map`.
- **HAProxy**: высокопроизводительные нативные ACL (`path_end -i`, `path_beg -i`, `query -m sub -i`, `req.hdr()`) с `http-request deny deny_status 403`.
- **Caddy Server**: идиоматичные именованные матчеры Caddyfile (`@waf_patch_*`) с выражениями CEL (`expression {http.request.uri.query}.matches(...)`) и `respond 403`.
- **Apache HTTP Server**: правила `mod_rewrite` (`RewriteCond %{QUERY_STRING}` / `%{REQUEST_URI}` / `%{HTTP_USER_AGENT}` + `RewriteRule ^ - [F,L]`) для `httpd.conf`, `<VirtualHost>` или `.htaccess`. Поддерживается через `--patch apache`.
- **Envoy Proxy**: записи маршрутов, сопоставляющие `:path`/заголовки через RE2 `safe_regex` с `direct_response: 403` (или forward-and-tag в режиме симуляции) для virtual_host в route_configuration. Поддерживается через `--patch envoy`.
- **Kubernetes Ingress (K8s)**: готовые к эксплуатации манифесты YAML `kind: Ingress` с аннотациями `nginx.ingress.kubernetes.io/server-snippet`.
- **Двухуровневая защита**:
- **Строгий хотфикс**: точные сигнатуры токенов с **0% риска ложных срабатываний** для немедленного реагирования на инциденты нулевого дня.
- **Эвристический шаблон**: обобщённые регулярные выражения, охватывающие всю структуру класса уязвимости.
- **Web UI Remediation Studio**: интерактивное модальное окно панели управления с живым предпросмотром для всех вендоров, копированием в буфер обмена в один клик, переключением форматов и экспортом файлов.
### Категории атак (всего 28)
SQL-инъекции, XSS, инъекции команд, обход путей, SSRF, локальное включение файлов, конфиденциальные файлы, открытый редирект, SSTI, XXE, NoSQL-инъекции, GraphQL-инъекции, атака на JWT (заголовок), атака на JWT (параметр), загрязнение прототипа (JSON-тело), загрязнение прототипа (URL/параметр), LDAP-инъекции, XPath-инъекции, инъекции формул в электронные таблицы, Log4Shell (JNDI), CRLF-инъекции, загрязнение HTTP-параметров, User-Agent, обход IP, контрабанда HTTP-запросов, отравление веб-кэша, обход UTF8/Unicode, обход ограничения инспекции WAF (паддинг).
### Обнаружение WAF
- Автоматическое определение типа WAF перед тестированием (Cloudflare, AWS WAF, OWASP Coraza, BunkerWeb, ModSecurity, Akamai, Imperva, F5 BIG-IP и др.).
- Предлагает конкретные методы обхода на основе обнаруженного WAF.
- Может автоматически переключаться на расширенные полезные нагрузки, специфичные для WAF.
### Расширенные полезные нагрузки и кодирование
- Полезные нагрузки для обхода WAF — двойное кодирование, unicode, смешанный регистр, инъекция комментариев, полиглотные полезные нагрузки.
- Улучшенные полезные нагрузки — современные методы уклонения.
- Вариации кодирования — URL, Unicode, HTML Entity, Hex, Octal, Base64 с автоматическими комбинациями.
- Обходы, специфичные для Cloudflare, AWS WAF, ModSecurity.
### Манипуляции с HTTP-протоколом
- Подмена HTTP-метода (HTTP Verb Tampering) — проверка необычных HTTP-методов.
- Загрязнение параметров (Parameter Pollution) — дублирование и разделение параметров между query и body.
- Путаница Content-Type — альтернативные типы содержимого для обхода правил.
- Заголовки Request Smuggling.
- Вариации инъекции Host-заголовка.
- Переопределение HTTP-метода через заголовки (`X-HTTP-Method-Override` и т. п.).
### Пакетное тестирование
- Тестирование нескольких URL одновременно.
- Настраиваемая конкурентность и задержка между запросами.
- Отслеживание прогресса в реальном времени.
### 🔀 Сравнение регрессий (`--compare` / `--fail-on-regression`)
- Сравнение сканирования с ранее сохранённым JSON-отчётом для выявления **новых обходов** (ранее блокировались, теперь нет), **новых заблокированных** полезных нагрузок, а также добавленных/удалённых тестов.
- CI-гейт (`--fail-on-regression`), который завершается ошибкой только при *ухудшении* состояния WAF, а не по всему списку результатов — идеально для отслеживания дрейфа управляемых наборов правил.
---
## Структура проекта
Проект организован как монорепозиторий NPM Workspaces:
- [**`packages/core/`**](file:///Users/alex/src/waf-checker/packages/core): Основная библиотека тестирования безопасности, определение полезных нагрузок, сигнатуры фингерпринтинга WAF и кодировщики обфускации.
- [**`packages/worker/`**](file:///Users/alex/src/waf-checker/packages/worker): Пакет Cloudflare Worker, обслуживающий статический HTML/JS веб-интерфейс и JSON API-эндпоинты.
- [**`packages/cli/`**](file:///Users/alex/src/waf-checker/packages/cli): Инструмент командной строки Node.js для выполнения аудитов непосредственно из терминала.
---
## Установка и сборка
Из корневого каталога установите зависимости и соберите все рабочие пространства:
```bash
npm install
npm run build
```
## Как запустить
### 1. Веб-версия (Cloudflare Worker)
Чтобы запустить локальный dev-сервер Worker (требуется Wrangler):
```bash
npm run dev:worker
```
Веб-интерфейс будет доступен по адресу `http://localhost:8787` (или на другом порту, если 8787 занят).
Чтобы развернуть Worker в Cloudflare:
```bash
npx wrangler deploy --workspace=packages/worker
```
Worker требует план **Workers Paid**: страницы сканирования и аудита рассчитаны на 10 000 подзапросов на запрос (`[limits] subrequests` в `wrangler.toml`, `WORKER_SUBREQUEST_LIMIT` в `packages/core/src/check.ts`). Бесплатный план допускает только 50 внешних подзапросов на запрос: одна страница сканирования с тестом обхода User-Agent (включён по умолчанию в UI) или с переходом по редиректам превышает этот лимит.
### 2. Версия CLI (Node.js)
#### Установка в качестве глобальной команды `waf-checker` (рекомендуется)
После `npm install && npm run build` в корне репозитория слинкуйте CLI, чтобы он запускался
из **любого каталога** — без `cd` в репозиторий и без длинных путей `node .../dist`:
```bash
# Expose `waf-checker` on your PATH from the built workspace
npm link --workspace @waf-checker/cli
# …now, from anywhere:
waf-checker --help
waf-checker check https://example.com
# Uninstall later with:
npm rm -g @waf-checker/cli
```
Опубликованный пакет включает свой код, поэтому вы также можете установить упакованную сборку глобально без репозитория: `npm pack --workspace @waf-checker/cli`, затем `npm i -g ./waf-checker-cli-*.tgz`.
#### Автодополнение оболочки (bash / zsh / fish)
`waf-checker completion <shell>` выводит скрипт автодополнения (опустите `<shell>`, чтобы автоматически определить из `$SHELL`):
```bash
# bash
waf-checker completion bash | sudo tee /etc/bash_completion.d/waf-checker
# or, without root: echo 'source <(waf-checker completion bash)' >> ~/.bashrc
# zsh (into a directory on your $fpath)
waf-checker completion zsh > "${fpath[1]}/_waf-checker"
# fish
waf-checker completion fish > ~/.config/fish/completions/waf-checker.fish
```
#### Запуск без глобальной установки
Вы всегда можете вызвать собранную точку входа напрямую:
```bash
# Print general CLI help and usage
node packages/cli/dist/index.js --help
# Print check command help (lists all methods, categories, and WAF vendors)
node packages/cli/dist/index.js check --help
# Discover detectable WAF vendors and payload categories (JSON for automation)
node packages/cli/dist/index.js list-wafs --json
node packages/cli/dist/index.js list-categories --json
```
#### Обнаружение WAF
Определение производителя WAF, стоящего за целевым URL:
```bash
node packages/cli/dist/index.js detect <url>
```
#### Аудит полезной нагрузки уязвимостей
Запустите аудит для целевого URL:
```bash
# Default check (GET method, all payload categories)
node packages/cli/dist/index.js check https://example.com
# Custom check with specific methods, categories, and WAF evasion enabled
node packages/cli/dist/index.js check https://example.com -m GET,POST -c "SQL Injection,XSS" --auto-detect-waf --encoding-variations
```
#### Пакетные аудиты
Запустите пакетные аудиты для списка URL, определённых в файле:
```bash
node packages/cli/dist/index.js batch targets.txt --concurrency 3
```
#### Генерация отчётов
Сохраняйте результаты аудита в форматах **SARIF**, **JUnit XML**, **HTML**, **Markdown**, **CSV** или **JSON**:
```bash
# Generate SARIF report for GitHub Code Scanning
node packages/cli/dist/index.js check https://example.com -o results.sarif
# Generate JUnit XML for CI test reporting (GitHub Actions, GitLab CI, Jenkins)
node packages/cli/dist/index.js check https://example.com -o results.xml
# Generate interactive HTML report
node packages/cli/dist/index.js check https://example.com -o report.html
# Generate Markdown summary for CI
node packages/cli/dist/index.js check https://example.com -o summary.md
```
> Формат отчёта определяется по расширению выходного файла или задаётся явно с помощью `-f, --format` (`json`, `csv`, `html`, `sarif`, `markdown`, `junit`). Каждая полезная нагрузка атаки становится `<testcase>` JUnit; обходы WAF сообщаются как `failure`, а ошибки транспорта/сервера — как `error`, поэтому CI-раннеры отображают их напрямую.
#### Интеграция с CI/CD и пороги защиты
Завершайте конвейеры CI/CD с ошибкой, когда уровень защиты ниже требуемого порога или когда обнаружены обходы:
```bash
# Fail if WAF protection rate is below 95%
node packages/cli/dist/index.js check https://example.com --threshold 95 -q
# Fail immediately on any detected bypass
node packages/cli/dist/index.js check https://example.com --fail-on-bypass -q
```
#### 🔀 Регрессионное сравнение (сканирование против сканирования)
Конфигурация WAF со временем меняется — вендор выпускает обновление управляемого набора правил, правило CRS отключается, изменение origin меняет вердикт. Вместо повторного разбора полного списка результатов при каждом запуске, сравните с ранее сохранённым JSON-отчётом и настраивайте CI-гейт только на *ухудшения*. Полезная нагрузка, которая была `blocked` в базовом отчёте и больше не блокируется, считается регрессией; полезная нагрузка, которая стала блокироваться, считается улучшением. Сопоставление выполняется по `(category, method, evasion technique, payload)`, а сетевые ошибки / блокировки на стороне origin считаются неоднозначными, поэтому они никогда не отображаются как ложные регрессии.
```bash
# Save a known-good baseline report
node packages/cli/dist/index.js check https://example.com -f json -o baseline.json -q
# Later: diff the current scan against it and print regressions/improvements
node packages/cli/dist/index.js check https://example.com --compare baseline.json -q
# Fail CI only when a previously-blocked payload is no longer blocked
node packages/cli/dist/index.js check https://example.com --compare baseline.json --fail-on-regression -q
```
#### 🛡️ Виртуальное патчинг и автоматическое исправление
Автоматически генерируйте готовые к развёртыванию правила межсетевого экрана для всех 11 поддерживаемых платформ (`cloudflare`, `aws`, `gcp`, `azure`, `modsecurity`, `nginx`, `haproxy`, `caddy`, `apache`, `envoy`, `k8s` или `all`):
```bash
# Generate and save Cloudflare Terraform rules during audit
node packages/cli/dist/index.js check https://example.com --patch cloudflare --patch-output ./cloudflare-patch.tf
# Generate GCP Cloud Armor gcloud commands and Terraform
node packages/cli/dist/index.js check https://example.com --patch gcp --patch-output ./cloud-armor.sh
# Generate Azure WAF rules with simulation (Log) mode
node packages/cli/dist/index.js check https://example.com --patch azure --patch-action simulate --patch-output ./azure-rules.json
# Generate HAProxy ACLs for haproxy.cfg
node packages/cli/dist/index.js check https://example.com --patch haproxy --patch-output ./haproxy-patches.cfg
# Generate Caddyfile named matchers
node packages/cli/dist/index.js check https://example.com --patch caddy --patch-output ./patches.caddyfile
# Generate Apache mod_rewrite rules for .htaccess
node packages/cli/dist/index.js check https://example.com --patch apache --patch-output ./patches.htaccess
# Generate Kubernetes Ingress YAML manifests
node packages/cli/dist/index.js check https://example.com --patch k8s --patch-output ./ingress-patch.yaml
# Generate patches for all vendors from a saved JSON audit report file
node packages/cli/dist/index.js patch audit-report.json --waf all --output ./patches/
```
#### 🐳 Тестирование локальной среды Docker и staging (`--allow-local`)
По умолчанию `waf-checker` строго блокирует диапазоны частных IP-адресов (`127.0.0.1`, `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) для предотвращения подделки запросов на стороне сервера (SSRF). При тестировании собственных локальных контейнеров Docker или staging-серверов используйте `--allow-local`:
```bash
# Audit a local OWASP ModSecurity Docker container and run reverse engineering
node packages/cli/dist/index.js check http://127.0.0.1:8088/ --allow-local --reverse
# Audit a local Caddy or HAProxy reverse proxy and generate patches
node packages/cli/dist/index.js check http://127.0.0.1:8089/ --allow-local --patch caddy
```
#### 🧪 Автоматизированный набор E2E-тестов в реальном Docker (`npm run test:e2e`)
Запустите сквозные интеграционные проверки против работающих Docker-контейнеров (ModSecurity CRS, Caddy, HAProxy, NGINX и Backend) одной командой:
```bash
npm run test:e2e
```
Полное руководство по локальному тестированию WAF и сквозной проверке (E2E) см. в [Local WAF Testing & E2E Validation Guide](https://github.com/sech0us3/waf-checker/blob/main/docs/LOCAL_WAF_TESTING.md) — там приведены полные результаты бенчмарков, схемы архитектуры и шаги для ручного воспроизведения.
---
## 🚀 GitHub Action (CI/CD)
Интегрируйте автоматизированное тестирование безопасности WAF в ваш рабочий процесс GitHub Actions:
```yaml
name: WAF Security Audit
on:
push:
branches: [ main ]
schedule:
- cron: '0 0 * * 1' # Weekly audit
jobs:
waf-audit:
runs-on: ubuntu-latest
permissions:
security-events: write # Required for SARIF upload
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Run WAF Checker
uses: SecH0us3/waf-checker@main
with:
target-url: 'https://staging.example.com'
threshold: '95'
enhanced: 'true'
advanced: 'true'
sarif-output: 'waf-results.sarif'
html-output: 'waf-report.html'
- name: Upload SARIF to GitHub Security Tab
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'waf-results.sarif'
- name: Upload HTML Report Artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: waf-audit-report
path: waf-report.html
```
### 3. Версия для Docker
Вы можете запускать CLI с помощью Docker, либо загрузив готовый образ из GitHub Container Registry, либо собрав его локально.
#### Использование готового образа (рекомендуется)
Готовый Docker-образ доступен в [GitHub Container Registry](https://github.com/SecH0us3/waf-checker/pkgs/container/waf-checker-cli) по адресу `ghcr.io/sech0us3/waf-checker-cli`.
##### Загрузите образ
```bash
docker pull ghcr.io/sech0us3/waf-checker-cli:latest
```
##### Вывод справки
```bash
docker run --rm ghcr.io/sech0us3/waf-checker-cli:latest --help
```
##### Запуск проверки
```bash
docker run --rm -it ghcr.io/sech0us3/waf-checker-cli:latest check https://example.com
```
##### Запуск пакетных аудитов (монтирование локального каталога)
```bash
docker run --rm -it -v "$(pwd):/data" ghcr.io/sech0us3/waf-checker-cli:latest batch /data/targets.txt --concurrency 3
```
#### Сборка локально
##### Сборка образа
```bash
docker build -t waf-checker-cli .
```
##### Вывод справки
```bash
docker run --rm waf-checker-cli --help
```
##### Запуск проверки
```bash
docker run --rm -it waf-checker-cli check https://example.com
```
##### Запуск пакетных аудитов (монтирование локального каталога)
```bash
docker run --rm -it -v "$(pwd):/data" waf-checker-cli batch /data/targets.txt --concurrency 3
```
## 🔌 API и интеграция (для внешних потребителей и фаззеров)
Cloudflare Worker предоставляет публичный REST API, используемый сканерами и фаззерами (включая [swazz](https://github.com/SecH0us3/swazz)). Полная спецификация OpenAPI 3.1 доступна в [`docs/openapi.yaml`](https://github.com/sech0us3/waf-checker/blob/main/docs/openapi.yaml).
### Обзор эндпоинтов
| Эндпоинт | Метод | Описание |
|---|---|---|
| `/api/waf-detect` | `GET` | Определяет вендора WAF, оценку уверенности и предлагаемые обходы. |
| `/api/check` | `GET`, `POST` | Проверяет цель с помощью атакующих полезных нагрузок. Поддерживает пагинацию и фильтрацию по категориям. |
| `/api/virtual-patch` | `POST` | Генерирует правила устранения для Cloudflare, AWS, ModSec, NGINX, Caddy, HAProxy, Coraza. |
| `/api/reverse-engineer` | `GET`, `POST` | Выполняет обратную разработку правил OWASP CRS, порогов аномалий и ограничений тела запроса. |
| `/api/audit` | `GET`, `POST` | **Унифицированный аудит**: выполняет обнаружение, проверки безопасности и виртуальные патчи, обычно в одном запросе (см. Пагинация аудита). |
### Ключевые возможности интеграции
- **Конверт пагинации (`?envelope=1` или `?envelope=true`)**:
Оборачивает результаты в структурированный конверт с метаданными пагинации:
```json
{
"results": [...],
"page": 0,
"pageSize": 50,
"total": 72,
"hasMore": true
}
```
*(Опустите `?envelope=1`, чтобы получить по умолчанию простой JSON-массив для обратной совместимости).*
- **Постраничная выдача аудита (`/api/audit`)**:
Аудит возвращает всё в одном ответе (`hasMore: false`), если только его план не превышает лимит подзапросов одного запроса Cloudflare Worker (1658 элементов). Это покрывает случай без обнаруженного WAF (513 элементов) и все варианты обхода для каждого WAF вплоть до Sophos (1321); цель, защищённая Qrator (2441 элемент), возвращается за две страницы, как и любой аудит, в котором вы передаёте меньший `pageSize`. Ответы содержат `page`, `pageSize`, `total`, `hasMore` и `detectedWAF` (`""`, если ничего не найдено). Пока `hasMore` равно true, запрашивайте `page=<page + 1>&detectedWAF=<detectedWAF>`; передача `detectedWAF` обратно пропускает повторное обнаружение (`detection` тогда равно `null`) и сохраняет стабильность границ страниц. `patches` покрывает результаты этого ответа; для одного пакета на нескольких страницах выполните `POST` объединённых `results` в `/api/virtual-patch`.
- **Нормализованная уверенность (`/api/waf-detect`)**:
Предоставляет `confidencePercent` (0–100) наряду с исходными `confidence` и `confidenceThreshold` (`40`).
- **Вердикт и флаги блокировки для каждого результата**:
Каждый `AuditResultItem` включает:
- `blocked: boolean` — Вмешался ли WAF до достижения источника.
- `verdict: 'blocked' | 'passed' | 'exposed'` — Отдельный исход, различающий утечки (`exposed`) и пробелы в покрытии (`passed`).
- `error: string | null` — Явная категория ошибки при сетевом обрыве (например, `'timeout'`, `'dns'`, `'connection_reset'`).
- **Отказ от самопроверки (HTTP 422)**:
Отклоняет случайные самопроверки, нацеленные на инфраструктуру сервиса, с `{ "error": "self-scan refused", "code": "SELF_SCAN_REFUSED" }`.
---
## Тестирование
Чтобы запустить набор тестов для всего рабочего пространства (с использованием Vitest):
---
[Read more](https://github.com/sech0us3/waf-checker)