> ## 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 registo e início de sessão contra bots, força bruta, e-mails descartáveis e redes arriscadas, com modo de ataque.

> [!WARNING]
>
> A autenticação é uma novidade. A proteção está desativada até a ativar. Os limites de pedidos e os limites de tentativas de código aplicam-se sempre.

A proteção contra bots é executada em cada criação de conta, início de sessão e redefinição de palavra-passe. Verifica a tentativa com base em seis políticas. Cada política tem um modo:

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

## Configurar a proteção

Consulte e altere as definições com `GET` e `PATCH` em `protection/`, na API de gestão de autenticação da sua aplicação, ou na consola.

```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 predefinição. Os modos acima são as predefinições depois de ativar a proteção.

## Políticas

| Política | É correspondida quando |
| - | - |
| `bots` | O cliente indica uma pontuação de bot de 0,8 ou superior, ou o agente do utilizador é um navegador sem interface gráfica ou automatizado conhecido. |
| `stuffing` | Um dispositivo ou endereço IP tenta aceder a 10 ou mais contas diferentes em 15 minutos, ou a palavra-passe é uma palavra-passe comprometida conhecida. |
| `brute` | A conta tem 5 ou mais tentativas falhadas. As palavras-passe erradas e os códigos errados de e-mail, telefone e autenticador contam todos. |
| `disposable` | Uma criação de conta usa um domínio de e-mail descartável. |
| `vpn` | O IP é uma VPN, Tor ou rede de centro de dados. |
| `travel` | O início de sessão está a mais de 500 km do anterior, a mais de 1000 km/h, em 24 horas. |

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

### Força bruta e bloqueio

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

* **Bloquear**: a pessoa tem de redefinir a palavra-passe antes de voltar a iniciar sessão.
* **Desafiar**: a conta fica bloqueada durante 15 minutos, e a tentativa seguinte exige uma prova adicional.
* **Desativado** ou **Registar**: sem bloqueio.

A redefinição de palavra-passe continua disponível após um bloqueio por força bruta, e uma redefinição remove o bloqueio. A sua equipa também pode desbloquear uma conta a partir da consola.

Se nunca guardou definições de proteção, aplica-se uma regra mais simples: 5 tentativas de palavra-passe falhadas bloqueiam a conta durante 15 minutos.

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

Envie sinais do dispositivo nas chamadas em tempo de execução com estes cabeçalhos. As páginas alojadas enviam-nos por si.

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

Estes sinais servem de contexto para uma decisão, mas não constituem prova de identidade. Também seguem com cada [evento de início de sessão](https://docs.didit.me/pt/authentication/events-and-webhooks.md), onde as regras podem ler `event.device.bot_score`.

> [!NOTE]
>
> `AUTOMATION_FRAMEWORK_DETECTED` é uma verificação diferente. É um [aviso de análise de IP e dispositivo](https://docs.didit.me/pt/core-technology/ip-analysis/warnings-ip-analysis.md) nas **sessões de verificação**, gerado quando o SDK de verificação indica uma estrutura de automação do navegador. Não é executado no início de sessão. No início de sessão, a automação é detetada pela política `bots` acima.

## Desafios

Uma tentativa desafiada devolve isto em vez de um código de início de sessão:

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

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

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

Tem 5 tentativas no espaço de 5 minutos. Se a pessoa não tiver nenhuma prova disponível, a chamada devolve `403 {"error": "protection_factor_unavailable"}`.

## Palavras-passe comprometidas

Com `breached_password_check: true`, a Didit verifica as palavras-passe novas e redefinidas em relação a palavras-passe comprometidas conhecidas. A própria palavra-passe nunca é enviada para qualquer lugar. Uma palavra-passe comprometida é rejeitada com `password_breached`. No início de sessão, uma palavra-passe comprometida conta como correspondência `stuffing`. Se a verificação não estiver disponível, a palavra-passe é aceite.

## Modo de ataque

Ative o modo de ataque durante um ataque ativo:

* `POST protection/attack-mode/` com `{"duration_hours": 1}` (ou `6` ou `24`) devolve `201`.
* `DELETE protection/attack-mode/` termina-o mais cedo. Também termina por si após a duração.

Enquanto o modo de ataque estiver ativo:

* todas as criações de conta e todos os inícios de sessão têm de passar por um desafio de **chave de acesso**. Um código por e-mail não é aceite. As novas criações de conta e as pessoas sem chave de acesso não conseguem concluir até o modo de ataque terminar.
* uma criação de conta a partir de uma VPN, Tor ou rede de centro de dados é bloqueada.

## Limites de pedidos

Cada rota de execução tem limite por IP, por aplicação:

| Rotas | Por minuto | Por hora |
| - | - | - |
| Descoberta e JWKS | 1200 | 12 000 |
| API de execução e páginas alojadas | 30 | 300 |
| Códigos por e-mail, códigos por telefone e callbacks de fornecedores | 5 | 20 |

Acima do limite, a chamada devolve `429`. Respeite um cabeçalho `Retry-After` quando for enviado. As tentativas de início de sessão também têm limite por minuto: 60 por IP, 15 por conta, 30 por dispositivo, 3000 por aplicação e 20 pedidos de código SMS ou WhatsApp por prefixo de número de telefone. As renovações de token têm um limite próprio por aplicação, de 6000 por minuto, para que as renovações nunca consumam os seus inícios de sessão.

## Eventos

Cada decisão fica registada como um [evento de autenticação](https://docs.didit.me/pt/authentication/events-and-webhooks.md): `risk_logged`, `attempt_challenged`, `attempt_blocked`, `challenge_passed`, `challenge_failed`, `attack_mode_started` e `attack_mode_ended`. O evento indica a política que gerou a correspondência.

## Teste

Numa aplicação de sandbox, teste cada modo que ativar: uma tentativa bloqueada, um desafio concluído e um desafio falhado, um bloqueio e o seu desbloqueio, e o modo de ataque ligado e desligado. Mantenha os erros genéricos na sua interface para que não revelem se uma conta existe.


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