> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Защита от ботов при входе: credential stuffing, брутфорс

> Didit защищает регистрацию и вход от ботов, credential stuffing, брутфорса, одноразовых email, рисковых сетей, impossible travel и режима атаки.

> [!WARNING]
>
> Аутентификация недавно добавлена. Защита выключена, пока вы её не включите. Ограничения частоты запросов и лимиты попыток ввода кода действуют всегда.

Защита от ботов работает при каждой регистрации, входе и сбросе пароля. Попытка проверяется по шести политикам. У каждой политики есть режим:

| Режим | Что происходит |
| - | - |
| **Выключено** | Политика не проверяется. |
| **Записывать** | Попытка продолжается. Событие `risk_logged` фиксирует совпадение. |
| **Проверять** | Человек должен пройти дополнительную проверку, прежде чем попытка продолжится. |
| **Заблокировать** | Попытка завершается ошибкой `403 {"error": "attempt_blocked"}`. |

## Настройка защиты

Чтобы читать и менять настройки, используйте `GET` и `PATCH` для `protection/` в API управления аутентификацией вашего приложения или в консоли.

```json theme={null}
{
  "enabled": true,
  "breached_password_check": true,
  "policies": {
    "bots": "block",
    "stuffing": "block",
    "brute": "challenge",
    "disposable": "block",
    "vpn": "challenge",
    "travel": "block"
  }
}
```

`enabled` и `breached_password_check` по умолчанию имеют значение `false`. Режимы, описанные выше, становятся значениями по умолчанию после включения защиты.

## Политики

| Политика | Срабатывает, когда |
| - | - |
| `bots` | Клиент передаёт оценку бота 0,8 или выше либо user agent является известным безинтерфейсным или автоматизированным браузером. |
| `stuffing` | Одно устройство или один IP-адрес пытается войти в 10 или более разных аккаунтов в течение 15 минут либо пароль входит в список скомпрометированных паролей. |
| `brute` | У аккаунта 5 или более неудачных попыток. Все неверные пароли, а также неверные коды из электронной почты, телефона и приложения-аутентификатора учитываются. |
| `disposable` | При регистрации используется одноразовый домен электронной почты. |
| `vpn` | IP-адрес относится к сети VPN, Tor или дата-центра. |
| `travel` | Вход выполняется более чем в 500 км от предыдущего, со скоростью более 1 000 км/ч, в течение 24 часов. |

Политики `vpn` и `travel` используют анализ IP-адресов Didit. Если этот запрос недоступен, попытка продолжается: вход никогда не завершается ошибкой из-за него. Местоположение для `travel` обновляется только после успешно завершённого входа.

### Перебор паролей и блокировка

Режим `brute` определяет, что происходит после 5 неудачных попыток:

* **Заблокировать**: человек должен сбросить пароль, прежде чем сможет снова войти.
* **Проверять**: аккаунт блокируется на 15 минут, а для следующей попытки нужна дополнительная проверка.
* **Выключено** или **Записывать**: блокировки нет.

Сброс пароля остаётся доступным после блокировки из-за перебора, и сброс снимает блокировку. Ваша команда также может разблокировать аккаунт в консоли.

Если вы никогда не сохраняли настройки защиты, действует более простое правило: 5 неверных паролей блокируют аккаунт на 15 минут.

### Оценка бота и сигналы устройства

Передавайте сигналы устройства при выполнении запросов с помощью этих заголовков. Размещённые страницы отправляют их за вас.

| Заголовок | Содержимое |
| - | - |
| `X-Didit-PID` | Постоянный идентификатор устройства, от 8 до 128 символов из `A-Z a-z 0-9 . _ : -`. |
| `X-Didit-FP-Hash` | Отпечаток устройства. |
| `X-Didit-FP-Bot-Score` | Оценка бота от 0 до 1. Значения вне этого диапазона игнорируются. |

Эти сигналы служат контекстом для решения, а не доказательством личности. Они также передаются с каждым [событием входа](https://docs.didit.me/ru/authentication/events-and-webhooks.md), где правила могут читать `event.device.bot_score`.

> [!NOTE]
>
> Код `AUTOMATION_FRAMEWORK_DETECTED` относится к другой проверке. Это [предупреждение анализа IP и устройства](https://docs.didit.me/ru/core-technology/ip-analysis/warnings-ip-analysis.md) для **сессий верификации**, которое возникает, когда SDK верификации сообщает о фреймворке автоматизации браузера. При входе она не выполняется. При входе автоматизацию обнаруживает политика `bots`, описанная выше.

## Проверки

Попытка, для которой требуется проверка, возвращает следующий ответ вместо кода входа:

```json theme={null}
{
  "protection_required": true,
  "challenge": "...",
  "methods": ["passkey", "email_code"],
  "options": { "...": "WebAuthn options when a passkey is offered" },
  "expires_in": 300
}
```

Завершите проверку с помощью `POST protection/complete/`:

* `{"challenge", "method": "email_code", "code"}` с 6-значным кодом, отправленным на электронную почту человека, или
* `{"challenge", "method": "passkey", "response"}` с ответом WebAuthn.

У вас есть 5 попыток в течение 5 минут. Если у человека нет доступного способа подтверждения, вызов возвращает `403 {"error": "protection_factor_unavailable"}`.

## Скомпрометированные пароли

Если задано `breached_password_check: true`, Didit проверяет новые пароли и пароли, устанавливаемые при сбросе, по известным скомпрометированным паролям. Сам пароль никуда не отправляется. Скомпрометированный пароль отклоняется с ошибкой `password_breached`. При входе скомпрометированный пароль считается совпадением по политике `stuffing`. Если проверка недоступна, пароль принимается.

## Режим атаки

Включайте режим атаки во время активной атаки:

* `POST protection/attack-mode/` с `{"duration_hours": 1}` (или `6` либо `24`) возвращает `201`.
* `DELETE protection/attack-mode/` завершает режим досрочно. Он также завершается сам по истечении заданной длительности.

Пока режим атаки включён:

* каждая регистрация и каждый вход должны пройти проверку с помощью **ключа доступа**. Код из электронной почты не принимается. Новые пользователи и люди без ключа доступа не смогут завершить регистрацию или вход до окончания режима атаки.
* регистрация с VPN, Tor или сети дата-центра блокируется.

## Ограничения частоты запросов

Для каждого маршрута рабочего API действуют ограничения по IP-адресу в рамках приложения:

| Маршруты | В минуту | В час |
| - | - | - |
| API обнаружения и JWKS | 1 200 | 12 000 |
| API выполнения и размещённые страницы | 30 | 300 |
| Коды электронной почты, коды телефона и обратные вызовы провайдеров | 5 | 20 |

При превышении лимита вызов возвращает `429`. Учитывайте заголовок `Retry-After`, если он передан. Попытки входа также ограничены по частоте в минуту: 60 на IP-адрес, 15 на аккаунт, 30 на устройство, 3 000 на приложение и 20 запросов кодов SMS или WhatsApp на префикс номера телефона. Обновления токенов имеют собственный лимит приложения: 6 000 в минуту, поэтому обновления никогда не расходуют ваши входы.

## События

Каждое решение записывается как [событие аутентификации](https://docs.didit.me/ru/authentication/events-and-webhooks.md): `risk_logged`, `attempt_challenged`, `attempt_blocked`, `challenge_passed`, `challenge_failed`, `attack_mode_started` и `attack_mode_ended`. В событии указано, какая политика сработала.

## Тестирование

В приложении-песочнице протестируйте каждый включённый режим: заблокированную попытку, пройденную и непройденную проверку, блокировку и её сброс, а также включение и выключение режима атаки. В интерфейсе показывайте общие ошибки, чтобы они не раскрывали, существует ли аккаунт.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.