> ## 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.

# Proteção contra bots no login: stuffing e força bruta

> Didit protege cadastro e login de bots, credential stuffing, força bruta, e-mails temporários, redes de risco e viagem impossível, com modo de ataque.

> [!WARNING]
>
> A autenticação é recente. A proteção fica desativada até você ativá-la. Os limites de requisições e o número limitado de tentativas de código sempre se aplicam.

A proteção contra bots é executada em todo cadastro, login e redefinição de senha. Ela verifica a tentativa em relação a seis políticas. Cada política tem um modo:

| Modo | O que acontece |
| - | - |
| **Desativado** | A política não é verificada. |
| **Registrar** | A tentativa continua. Um evento `risk_logged` registra a correspondência. |
| **Desafio** | A pessoa precisa passar por uma prova adicional antes que a tentativa continue. |
| **Bloquear** | A tentativa falha com `403 {"error": "attempt_blocked"}`. |

## Configurar a proteção

Leia e altere as configurações com `GET` e `PATCH` em `protection/` na API de gerenciamento de autenticação da sua aplicação, ou pelo console.

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

`enabled` e `breached_password_check` são `false` por padrão. Os modos acima são os padrões depois que você ativa a proteção.

## Políticas

| Política | Corresponde quando |
| - | - |
| `bots` | O cliente informa uma pontuação de bot de 0,8 ou mais, ou o user agent é um navegador headless ou automatizado conhecido. |
| `stuffing` | Um mesmo dispositivo ou IP tenta 10 ou mais contas diferentes em 15 minutos, ou a senha é uma senha conhecida por ter sido vazada. |
| `brute` | A conta tem 5 ou mais tentativas com falha. Senhas erradas e códigos de e-mail, telefone e autenticador errados contam. |
| `disposable` | Um cadastro usa um domínio de e-mail descartável. |
| `vpn` | O IP é de uma VPN, do Tor ou de uma rede de data center. |
| `travel` | O login ocorre a mais de 500 km do anterior, a mais de 1.000 km/h, em até 24 horas. |

As políticas `vpn` e `travel` usam a análise de IP da Didit. Se essa consulta estiver indisponível, a tentativa continua; um login nunca falha por causa dela. A localização para `travel` só é atualizada depois de um login concluído.

### Força bruta e bloqueio de conta

O modo de `brute` decide o que acontece após 5 falhas:

* **Block**: a pessoa precisa redefinir a senha antes de poder fazer login novamente.
* **Challenge**: a conta fica bloqueada por 15 minutos, e a próxima tentativa exige uma prova adicional.
* **Off** ou **Log**: nenhum bloqueio.

A redefinição de senha continua disponível após um bloqueio por força bruta, e uma redefinição remove o bloqueio. Sua equipe também pode desbloquear uma conta pelo console.

Se você nunca salvou as configurações de proteção, uma regra mais simples se aplica: 5 senhas erradas bloqueiam a conta por 15 minutos.

### Pontuação de bot e sinais do dispositivo

Envie sinais do dispositivo nas chamadas de runtime com estes cabeçalhos. As páginas hospedadas os enviam por você.

| Cabeçalho | Conteúdo |
| - | - |
| `X-Didit-PID` | Um ID de dispositivo persistente, com 8 a 128 caracteres de `A-Z a-z 0-9 . _ : -`. |
| `X-Didit-FP-Hash` | Uma impressão digital (fingerprint) do dispositivo. |
| `X-Didit-FP-Bot-Score` | Uma pontuação de bot de 0 a 1. Valores fora desse intervalo são ignorados. |

Esses sinais são contexto para uma decisão, não prova de identidade. Eles também acompanham cada [evento de login](https://docs.didit.me/pt-br/authentication/events-and-webhooks.md), em que as regras podem ler `event.device.bot_score`.

> [!NOTE]
>
> `AUTOMATION_FRAMEWORK_DETECTED` é uma verificação diferente. É um [aviso da análise de IP e dispositivo](https://docs.didit.me/pt-br/core-technology/ip-analysis/warnings-ip-analysis.md) em **sessões de verificação**, gerado quando o SDK de verificação informa a detecção de um framework de automação de navegador. Ele não é executado no login. No login, a automação é detectada pela política `bots` acima.

## Desafios

Uma tentativa sujeita a um desafio retorna isto em vez de um código de login:

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

Conclua o desafio com `POST protection/complete/`:

* `{"challenge", "method": "email_code", "code"}` com o código de 6 dígitos enviado ao e-mail da pessoa, ou
* `{"challenge", "method": "passkey", "response"}` com a resposta WebAuthn.

Você tem 5 tentativas em até 5 minutos. Se a pessoa não tiver nenhuma prova disponível, a chamada retorna `403 {"error": "protection_factor_unavailable"}`.

## Senhas vazadas

Com `breached_password_check: true`, a Didit verifica senhas novas e redefinidas em relação a senhas vazadas conhecidas. A senha em si nunca é enviada a lugar nenhum. Uma senha vazada é rejeitada com `password_breached`. No login, uma senha vazada conta como uma correspondência de `stuffing`. Se a verificação estiver indisponível, a senha é aceita.

## Modo de ataque

Ative o modo de ataque durante um ataque em andamento:

* `POST protection/attack-mode/` com `{"duration_hours": 1}` (ou `6` ou `24`) retorna `201`.
* `DELETE protection/attack-mode/` o encerra antes do previsto. Ele também termina sozinho após o período definido.

Enquanto o modo de ataque estiver ativo:

* todos os cadastros e logins precisam passar por um desafio de **passkey**. Um código por e-mail não é aceito. Novos cadastros e pessoas sem passkey não conseguem concluir o cadastro até o modo de ataque terminar.
* um cadastro feito a partir de uma VPN, do Tor ou de uma rede de data center é bloqueado.

## Limites de requisições

Toda rota de runtime é limitada por IP, por aplicação:

| Rotas | Por minuto | Por hora |
| - | - | - |
| Discovery e JWKS | 1.200 | 12.000 |
| API de runtime e páginas hospedadas | 30 | 300 |
| Códigos por e-mail, códigos por telefone e callbacks de provedores | 5 | 20 |

Acima do limite, a chamada retorna `429`. Respeite o cabeçalho `Retry-After` quando ele for enviado. As tentativas de login também são limitadas por minuto: 60 por IP, 15 por conta, 30 por dispositivo, 1.000 por aplicação e 20 requisições de código por SMS ou WhatsApp por prefixo de número de telefone.

## Eventos

Cada decisão é registrada como um [evento de autenticação](https://docs.didit.me/pt-br/authentication/events-and-webhooks.md): `risk_logged`, `attempt_challenged`, `attempt_blocked`, `challenge_passed`, `challenge_failed`, `attack_mode_started` e `attack_mode_ended`. O evento mostra qual política foi correspondida.

## Testar

Em uma aplicação de sandbox, teste cada modo que você ativar: uma tentativa bloqueada, um desafio aprovado e um com falha, um bloqueio de conta e sua redefinição, e o modo de ataque ativado e desativado. Mantenha as mensagens de erro genéricas na sua interface para que elas não revelem se uma conta existe.


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