Files
bi-descomplicar/SECURITY-FIX.md
T
ealmeida 05eb31f36e docs(okf): frontmatter OKF + rich abstracts nas descriptions
Normalizacao OKF dos .md: type/title/description/timestamp/layer +
descriptions factuais (rich abstracts). Apenas .md tracked; corpos intactos.
Parte da aplicacao OKF a /Dados/Dev (28-06-2026).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 22:58:21 +01:00

3.3 KiB

type, title, description, timestamp, layer
type title description timestamp layer
Document Security Fix Registo das correcções de segurança do bi-descomplicar, incluindo autenticação via middleware Next.js e header x-api-key a proteger todas as rotas /api/* contra acesso não autenticado. 2026-02-14T03:24:04.040993+00:00 wiki

Security Fix - 2026-02-14

Vulnerabilidades Críticas Corrigidas

[C-001] Ausência de Autenticação

Status: RESOLVIDO Ficheiros criados:

  • src/middleware.ts - Middleware Next.js que protege todas as rotas /api/*
  • src/lib/auth.ts - Utilitários de autenticação (API key validation)
  • .env.example - Template com API_SECRET_KEY

Implementação:

  • Autenticação via header x-api-key
  • Middleware aplica-se a todas as rotas /api/* (exceto /api/health)
  • Resposta 401 Unauthorized para requests sem API key válida

Como usar:

# 1. Copiar .env.example para .env
cp .env.example .env

# 2. Gerar API key segura
openssl rand -base64 32

# 3. Configurar no .env
API_SECRET_KEY="sua-chave-gerada"

# 4. Fazer requests com header
curl -H "x-api-key: sua-chave-gerada" http://localhost:3000/api/sites

[C-002] Validação de Input Insuficiente

Status: RESOLVIDO Ficheiros criados:

  • src/lib/validations.ts - Schemas Zod para validação

Ficheiros modificados:

  • src/app/api/metrics/[siteId]/route.ts - Validação de siteId e period

Implementação:

  • siteIdSchema: Valida que siteId é inteiro positivo
  • periodSchema: Valida período (formato: 30d, 90d) entre 1-365 dias
  • Retorna 400 Bad Request com detalhes de erro para inputs inválidos

Proteções adicionadas:

// Antes (perigoso)
const siteId = parseInt(params.siteId) // NaN possível

// Depois (seguro)
const { siteId } = siteIdSchema.parse({ siteId: rawSiteId })
// Lança ZodError se inválido

[C-003] Erro TypeScript/ESLint

Status: RESOLVIDO Ficheiro modificado:

  • src/components/dashboard/chart-card.tsx:23

Implementação:

// Antes
data: Array<Record<string, any>> // ❌ ESLint error

// Depois
data: Array<Record<string, string | number | null>> // ✅ Type-safe

Correção Bonus

[M-005] .gitignore Sobre-restritivo

Status: RESOLVIDO Ficheiro modificado:

  • .gitignore

Implementação:

.env*
!.env.example  # Permite commitar template

Verificações

ESLint

pnpm run lint
# ✅ Sem erros

Security Audit

pnpm audit
# ✅ 0 vulnerabilidades

Próximos Passos (Recomendado)

Prioridade Alta

  • Gerar API key em produção
  • Configurar API_SECRET_KEY no servidor
  • Testar autenticação com client real
  • Implementar rate limiting ([M-001])

Prioridade Média

  • Adicionar caching ([M-002])
  • Corrigir useEffect cleanup ([M-003])
  • Adicionar índices Prisma ([M-004])

Prioridade Baixa

  • Extrair lógica para services ([O-001])
  • Implementar testes ([O-002])
  • Adicionar scripts npm ([O-003])

Impacto

Antes: 3 vulnerabilidades críticas, 0 proteções Depois: 0 vulnerabilidades críticas, autenticação + validação completas

CVSS Score: 7.5 → 0.0


Auditoria: 2026-02-14 Correções: 2026-02-14 Regra: #47 (Security Audit Pre-Commit)