Security Architecture
O Elo Orgânico implementa uma estratégia de segurança em múltiplas camadas para proteger os dados da comunidade e garantir a integridade dos ciclos de compartilhamento. Nossa abordagem combina protocolos padrão da indústria com proteção especializada contra bots e mitigação de ataques de força bruta (brute-force).
1. Bot Protection (Cloudflare Turnstile)
To prevent automated registrations and login attempts, we utilize Cloudflare Turnstile. Unlike traditional CAPTCHAs, Turnstile provides a privacy-focused, non-intrusive verification experience.
1.1. Client-Side Integration (React 19)
The AuthFeature utiliza o componente @marsidev/react-turnstile no Modo Gerenciado.
- Modo Gerenciado: Exibe um checkbox inteligente que verifica se o usuário é humano.
- State Management: O botão de envio permanece desabilitado até que um
turnstileTokenválido seja emitido pelo widget. - Isolation: Cada formulário (Login/Registro) mantém sua própria instância do Turnstile via chaves React únicas para garantir uma nova validação ao alternar entre os modos.
1.2. Server-Side Validation (Fastify 5)
The API does not trust client-side state alone.
- Verification: O
AuthServicerealiza uma requisição POST segura parahttps://challenges.cloudflare.com/turnstile/v0/siteverify. - IP Validation: O endereço IP do cliente é passado para a Cloudflare para detectar botnets baseadas em proxy.
- Mandatory DTOs: Os esquemas
LoginDTOSchemaeRegisterDTOSchemano@elo-instance/coreexigem estritamente oturnstileToken.
2. Brute-Force Mitigation
We protect our authentication endpoints from dictionary attacks and automated guessing through two primary mechanisms.
2.1. Rate Limiting
Utilizando o @fastify/rate-limit, aplicamos limites específicos de contexto para rotas sensíveis.
- Global Policy: Um limite base de 100 requisições por minuto por IP para uso geral da API.
- Strict Auth Policy: As rotas
/api/auth/logine/api/auth/registersão limitadas a 5 tentativas por minuto por IP. - Return Code: Exceder estes limites dispara uma resposta
429 (Too Many Requests).
2.2. Account Lockout Logic
To prevent targeted attacks against specific user accounts:
- Max Attempts: Após 5 tentativas consecutivas falhas, a conta é bloqueada.
- Lock Duration: A conta permanece inacessível por 15 minutos (
lockUntil). - Persistence: O estado de bloqueio é armazenado diretamente no modelo
Userdo Mongoose (loginAttempts,lockUntil).
3. Data Protection & Obfuscation
3.1. User Enumeration Prevention
The API is designed to leak as little information as possible about the system's state to unauthenticated users.
- Generic Errors: Tanto "Usuário Não Encontrado" quanto "Senha Inválida" retornam um código de erro unificado
INVALID_CREDENTIALS. - Uniform Response Time: Comparações criptográficas (Bcrypt) são realizadas mesmo que o identificador do usuário não exista, prevenindo ataques de tempo (timing attacks).
3.2. Secure Communication
- JWT (HS256): Todas as requisições autenticadas exigem um JSON Web Token assinado com um segredo simétrico forte.
- CSRF Protection: O
@fastify/csrf-protectionestá ativado, exigindo um cabeçalhoCSRF-Tokenpara todas as requisições que alteram estado (POST, PUT, DELETE). - HTTP-Only Cookies: Os tokens de sessão são armazenados em cookies assinados e HTTP-only para mitigar o roubo de tokens via XSS.
4. Environment Requirements
As seguintes chaves de segurança são obrigatórias para a operação do stack Instance:
| Ambiente | Variável | Propósito |
|---|---|---|
| API | TURNSTILE_SECRET_KEY | Validação no servidor dos tokens Turnstile. |
| Web | VITE_TURNSTILE_SITE_KEY | Renderização do widget Turnstile no frontend. |
| API | JWT_SECRET | Assinatura de tokens de autenticação. |
| API | SESSION_SECRET | Criptografia de cookies de sessão. |
Última Atualização: Junho de 2026