diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100644 new mode 100755 index f04eaa9..fa27c75 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,31 @@ Todas as alterações notáveis neste projecto serão documentadas neste ficheiro. +## [2.6.0] - 2026-02-14 + +### Security +- **CRÍTICO** - Removidas credenciais hardcoded em `api/db.ts` + - Eliminados fallbacks de password, user e database + - Adicionada validação obrigatória de variáveis de ambiente + - Adicionados timeouts de conexão (connectTimeout: 10s, acquireTimeout: 15s, timeout: 30s) +- **CRÍTICO** - Removida API key hardcoded em `api/routes/wp-monitor.ts` + - Eliminado fallback `descomplicar-monitor-2026` + - Adicionada validação obrigatória de `WP_MONITOR_API_KEY` +- **VERIFICADO** - Confirmado que `.env` nunca foi commitado ao Git + - Credenciais locais nunca foram expostas no repositório + - `.gitignore` a funcionar correctamente + +### Changed +- `api/db.ts` - Credenciais agora exigem variáveis de ambiente obrigatórias +- `api/routes/wp-monitor.ts` - API key agora exige variável de ambiente obrigatória + +### Technical Notes +- Auditoria de segurança realizada - 3 vulnerabilidades críticas identificadas +- 2 corrigidas (hardcoded credentials), 1 era falso positivo +- Próximos passos: implementar rate limiting, CORS restrito, validação de input (Zod) + +--- + ## [2.5.0] - 2026-02-10 ### Added diff --git a/api/db.ts b/api/db.ts old mode 100644 new mode 100755 index 4b9d0c9..6025331 --- a/api/db.ts +++ b/api/db.ts @@ -8,15 +8,23 @@ import mysql from 'mysql2/promise' // Database configuration const config = { host: process.env.DB_HOST || 'localhost', - user: process.env.DB_USER || 'ealmeida_desk24', - password: process.env.DB_PASS || '9qPRdCGGqM4o', - database: process.env.DB_NAME || 'ealmeida_desk24', + user: process.env.DB_USER, + password: process.env.DB_PASS, + database: process.env.DB_NAME, waitForConnections: true, connectionLimit: 10, queueLimit: 0, + connectTimeout: 10000, // 10 segundos + acquireTimeout: 15000, // 15 segundos + timeout: 30000, // 30 segundos para queries charset: 'utf8mb4' } +// Validação obrigatória de credenciais +if (!process.env.DB_USER || !process.env.DB_PASS || !process.env.DB_NAME) { + throw new Error('Missing required database environment variables: DB_USER, DB_PASS, DB_NAME') +} + // Create connection pool const pool = mysql.createPool(config) diff --git a/api/routes/wp-monitor.ts b/api/routes/wp-monitor.ts old mode 100644 new mode 100755 index b697c0e..bae7646 --- a/api/routes/wp-monitor.ts +++ b/api/routes/wp-monitor.ts @@ -11,7 +11,12 @@ import type { Request, Response } from 'express' import db from '../db.js' const router = Router() -const API_KEY = process.env.WP_MONITOR_API_KEY || 'descomplicar-monitor-2026' + +// Validação obrigatória da API key +const API_KEY = process.env.WP_MONITOR_API_KEY +if (!API_KEY) { + throw new Error('WP_MONITOR_API_KEY environment variable is required') +} // Middleware to validate API key function validateApiKey(req: Request, res: Response, next: Function) { diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 index da5c978..cc983c1 --- a/package-lock.json +++ b/package-lock.json @@ -5125,9 +5125,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0"