Skip to main content

Visão Geral

O AssessIQ aplica múltiplas camadas de segurança para proteger dados de usuários, sessões e endpoints.

Autenticação

Login via POST

Credenciais enviadas no corpo da requisição (JSON), nunca via URL ou query params.

Bcrypt

Senhas armazenadas com bcrypt (cost factor 10). Nunca armazenadas em texto plano.

Sessão JWT

Cookie next-auth.session-token com flags HttpOnly e Secure. Inacessível via JavaScript.

2FA

Suporte a autenticação de dois fatores via e-mail OTP ou TOTP.

Revogação de Sessão

Toda sessão carrega um sessionVersion validado a cada request. Ao alterar senha, revogar sessão ou atualizar permissões, o sessionVersion é incrementado e todas as sessões ativas são invalidadas imediatamente.

Headers HTTP de Segurança

Adicionados globalmente via next.config.ts, aplicados em todas as rotas (/(.*)):
HeaderValorProteção
X-Frame-OptionsSAMEORIGINAnti-clickjacking
X-Content-Type-OptionsnosniffAnti-MIME sniffing
Strict-Transport-Securitymax-age=31536000; includeSubDomains; preloadForça HTTPS por 1 ano
Referrer-Policystrict-origin-when-cross-originLimita dados no Referer
Permissions-Policycamera=(), microphone=(), geolocation=()Desativa APIs de browser
X-XSS-Protection1; mode=blockAnti-XSS em browsers legados
Content-Security-PolicyWhitelist de origens — inclui vercel.live, *.vercel.live, *.pusher.com, va.vercel-scripts.com, fonts.gstatic.comAnti-XSS e injeção de scripts
A CSP é gerenciada exclusivamente via next.config.ts. Não adicione headers de CSP no vercel.json — isso sobrescreve a configuração completa com uma versão incompleta.

Rate Limiting

Implementado com Upstash Redis + sliding window:
EndpointLimiteJanela
/api/auth/check-credentials5 tentativas10 minutos por IP
/api/users/forgot-password5 tentativas10 minutos por IP e por e-mail
API geral100 req1 minuto por IP
Submissões20 req1 hora por IP
Upload10 req1 hora por IP
Export5 req1 hora por IP
Email2 req1 minuto por IP
Search30 req1 minuto por IP
Se o Redis estiver indisponível, o rate limiting falha aberto (fail-open) — requisições são permitidas e o erro é registrado nos logs. Isso evita bloqueio de logins legítimos por falha de infraestrutura Redis.

CSRF

Proteção via double-submit cookie:
  • Cookie csrf-token definido em cada resposta (SameSite=Lax, Secure=true)
  • Header X-CSRF-Token obrigatório em requisições POST/PUT/PATCH/DELETE
  • Verificado no proxy.ts antes de qualquer handler de rota
  • Rotas /api/auth/* (NextAuth) e /api/mobile/* (JWT Bearer) são isentas de CSRF
  • Se CSRF_SECRET não estiver configurada, a proteção é desabilitada com log de erro crítico (não causa crash)

CORS

  • Origens permitidas configuradas via variável de ambiente ALLOWED_ORIGINS
  • Requisições de origens não listadas são bloqueadas com 403
  • Sempre inclui a própria origem do servidor (same-origin)

Logs e PII

  • Emails não são logados em produção para evitar exposição de dados pessoais
  • Logs de erro identificam usuários apenas por uid= (ID interno)
  • Sentry captura erros sem PII em campos sensíveis

Política de Senhas

  • Mínimo de 8 caracteres
  • Armazenamento com bcrypt
  • DEFAULT_DEV_PASSWORD bloqueado em produção — usuários sem senha devem redefinir via “esqueci minha senha”
  • Tokens de redefinição de senha: armazenados como SHA-256 no banco; expiram em 30 minutos

Proteção de Dados

  • Campos sensíveis (CPF, dados médicos) criptografados na camada do Prisma via prisma-encryption-extension
  • Backups exportados com timestamp e controle de acesso por role
  • Soft delete: dados nunca apagados permanentemente sem ação explícita de SUPER_ADMIN

Checklist de Deploy Seguro

1

Variáveis de ambiente

Configure NEXTAUTH_SECRET, DATABASE_URL, REDIS_URL, ALLOWED_ORIGINS e ENCRYPTION_KEY com valores fortes.
2

HTTPS obrigatório

Garanta que o domínio usa TLS. O header HSTS reforça isso após o primeiro acesso.
3

Revise ALLOWED_ORIGINS

Liste apenas os domínios efetivamente utilizados. Evite *.
4

2FA para admins

Ative 2FA para todas as contas com role ADMIN e SUPER_ADMIN.
5

Rotação de segredos

Rotacione NEXTAUTH_SECRET e ENCRYPTION_KEY periodicamente. Isso invalida todas as sessões ativas.