Tests de Seguridad
Floutic incluye una suite completa de tests de seguridad que validan todas las medidas de seguridad implementadas, garantizando la protección de usuarios y datos.
Suite de Tests de Seguridad
Estado Actual
- Total de tests (E2E): 31+ tests ✅
- Tests unitarios adicionales: backend
tests/core/test_security.py+ frontendsrc/__tests__/security/ - Cobertura: medidas de seguridad críticas + auditoría de IP ✅
Tests Implementados
1. Security Headers and CORS (3 tests)
Archivo: tests/security-headers-cors.spec.ts
Tests
- ✅ Verificación de headers de seguridad en respuestas de API
- ✅ Verificación de CORS permite origen confiable
- ✅ Verificación de que OPTIONS requests funcionan correctamente
Ejemplo
test('should include security headers in API responses', async ({ page }) => {
const response = await page.goto('/api/auth/verify_secure');
expect(response.headers()['x-content-type-options']).toBe('nosniff');
expect(response.headers()['x-frame-options']).toBe('DENY');
expect(response.headers()['strict-transport-security']).toContain('max-age');
});
2. Authentication Secure (6 tests)
Archivo: tests/authentication-secure.spec.ts
Tests
- ✅ Login seguro con HttpOnly cookies
- ✅ Verificar que access token no se almacena en localStorage
- ✅ Renovación automática de tokens
- ✅ Logout seguro elimina cookies
- ✅ Protección CSRF en requests autenticados
- ✅ session_id se almacena en sessionStorage y se envía en headers
Ejemplo
test('should store refresh token in HttpOnly cookie', async ({ page }) => {
await page.goto('/login');
await page.fill('[name="username"]', 'test@example.com');
await page.fill('[name="password"]', 'password123');
await page.click('button[type="submit"]');
const cookies = await page.context().cookies();
const refreshToken = cookies.find(c => c.name === 'refresh_token');
expect(refreshToken).toBeDefined();
expect(refreshToken.httpOnly).toBe(true);
expect(refreshToken.sameSite).toBe('Strict');
});
3. Concurrent Sessions (3 tests)
Archivo: tests/concurrent-sessions.spec.ts
Tests
- ✅ Múltiples usuarios de la misma empresa pueden hacer login simultáneamente
- ✅ Límite de sesiones concurrentes por usuario individual (máximo 10)
- ✅ Aislamiento de sesiones entre pestañas
Ejemplo
test('should allow multiple sessions for same company user', async ({ browser }) => {
const context1 = await browser.newContext();
const context2 = await browser.newContext();
// Login en ambas ventanas
await loginInContext(context1, 'empresa1@example.com');
await loginInContext(context2, 'empresa1@example.com');
// Ambas sesiones deben ser válidas
expect(await verifySession(context1)).toBe(true);
expect(await verifySession(context2)).toBe(true);
});
4. CSRF Protection (4 tests)
Archivo: tests/csrf-protection.spec.ts
Tests
- ✅ Verificar que requests POST incluyen CSRF token
- ✅ Verificar que requests sin CSRF token son rechazados
- ✅ Verificar que CSRF token se renueva después de refresh
- ✅ Verificar CSRF en diferentes tipos de requests (POST, PUT, DELETE, PATCH)
Ejemplo
test('should reject POST requests without CSRF token', async ({ page }) => {
await login(page);
const response = await page.request.post('/api/projects', {
data: { title: 'Test Project' },
headers: {
// Sin X-CSRF-Token
}
});
expect(response.status()).toBe(403);
expect(await response.json()).toHaveProperty('detail', 'Invalid CSRF token');
});
5. Input Validation and XSS Protection (9 tests)
Archivo: tests/input-validation-xss.spec.ts
Tests
- ✅ Sanitizar inputs en formulario de registro
- ✅ Sanitizar inputs en formulario de creación de proyecto
- ✅ Sanitizar mensajes de chat
- ✅ Verificar que DOMPurify está disponible y configurado
- ✅ Sanitizar URLs peligrosas
- ✅ Verificar que contenido renderizado no ejecuta scripts
- ✅ Validación de formato de email
- ✅ Validación de fortaleza de contraseña
Ejemplo
test('should sanitize XSS in project description', async ({ page }) => {
await login(page);
await page.goto('/publicar-proyecto');
const maliciousInput = '<script>alert("XSS")</script>';
await page.fill('[name="description"]', maliciousInput);
await page.click('button[type="submit"]');
// Verificar que el script no se ejecuta
const description = await page.textContent('.project-description');
expect(description).not.toContain('<script>');
expect(description).toContain('<script>'); // Escapado
});
6. Rate Limiting Frontend Handling (5 tests)
Archivo: tests/rate-limiting-frontend.spec.ts
Tests
- ✅ Verificar mensaje de error cuando hay rate limiting en login
- ✅ Verificar que el frontend maneja rate limiting global correctamente
- ✅ Verificar mensaje apropiado para rate limiting por IP
- ✅ Verificar que el frontend no permite múltiples requests simultáneas que causen rate limiting
- ✅ Verificar que el frontend muestra tiempo de espera para rate limiting
Ejemplo
test('should show rate limit message on login', async ({ page }) => {
// Intentar login múltiples veces para activar rate limiting
for (let i = 0; i < 6; i++) {
await page.goto('/login');
await page.fill('[name="username"]', 'test@example.com');
await page.fill('[name="password"]', 'wrongpassword');
await page.click('button[type="submit"]');
await page.waitForTimeout(100);
}
// Verificar mensaje de rate limiting
const errorMessage = await page.textContent('.error-message');
expect(errorMessage).toContain('Demasiados intentos');
expect(errorMessage).toContain('espera');
});
7. Backend Security Tests (Pytest)
Floutic incluye una suite dedicada de tests de seguridad en el backend para validar las defensas a nivel de servidor.
Ubicación: backend/tests/security/
Tests Implementados
-
Protección CSRF (
test_csrf.py)- ✅ Bloqueo de peticiones sin token (403)
- ✅ Bloqueo de peticiones con solo cookie o solo header
- ✅ Bloqueo de tokens que no coinciden (Cookie vs Header)
- ✅ Éxito con tokens válidos (Double Submit Cookie)
-
Validación de Archivos (
test_file_uploads.py)- ✅ Aceptación de archivos válidos (PDF real)
- ✅ Detección y bloqueo de MIME Spoofing (Script renombrado a .jpg)
- ✅ Validación basada en contenido (Magic Numbers)
-
Ofuscación de Logs (
test_log_scrubbing.py)- ✅ Ofuscación de claves sensibles (
password,token, etc.) - ✅ Funcionamiento recursivo en JSON anidados y listas
- ✅ Case-insensitive (detecta
PASSWORDoPassword)
- ✅ Ofuscación de claves sensibles (
Ejecución
# Ejecutar suite de seguridad backend
./scripts/test_backend.sh tests/security/
- Auditoría de IP (
tests/core/test_security.py)- ✅ Detección de IP con X-Forwarded-For (una o múltiples IPs)
- ✅ Prioridad de headers (Cloudflare, X-Real-IP)
- ✅ Fallback a conexión directa
Ejecución (auditoría de IP)
./scripts/test_backend.sh tests/core/test_security.py
Ejecutar Tests de Seguridad (Frontend)
Tests unitarios de seguridad
./scripts/test_frontend_unit.sh src/__tests__/security/email-verification-xss.test.ts
Desde Script
./scripts/test_frontend_security.sh
Desde Script
./scripts/test_e2e.sh \
tests/security-headers-cors.spec.ts \
tests/authentication-secure.spec.ts \
tests/concurrent-sessions.spec.ts \
tests/csrf-protection.spec.ts \
tests/input-validation-xss.spec.ts \
tests/rate-limiting-frontend.spec.ts
Ejecutar Suite Completa
./scripts/test_e2e.sh tests/security-*.spec.ts
Cobertura de Seguridad
Medidas Validadas
✅ Autenticación
- HttpOnly cookies
- Session ID único
- Refresh automático de tokens
- Logout seguro
✅ Autorización
- RBAC (Role-Based Access Control)
- Protección de rutas
- Validación de permisos
✅ Protección de Datos
- CSRF protection
- XSS protection
- Input validation
- Output sanitization
✅ Infraestructura
- Security headers
- CORS configuration
- Rate limiting
- HTTPS enforcement
✅ Sesiones
- Aislamiento entre ventanas
- Límites de sesiones concurrentes
- Invalidación de tokens
- Timeout por inactividad
Mejores Prácticas
Escribir Tests de Seguridad
-
Cubrir todos los vectores de ataque
- XSS, CSRF, SQL Injection, etc.
- Autenticación y autorización
- Rate limiting y DoS
-
Testear casos edge
- Tokens expirados
- Sesiones concurrentes
- Ventanas privadas
- Cookies malformadas
-
Validar comportamiento del frontend
- Mensajes de error apropiados
- Manejo de rate limiting
- Redirecciones seguras
-
Mantener tests actualizados
- Actualizar cuando se añaden nuevas medidas
- Revisar regularmente
- Añadir tests para nuevos vectores
Integración Continua
Los tests de seguridad se ejecutan automáticamente en CI/CD:
# .github/workflows/test.yml
- name: Run Security Tests
run: |
./scripts/test_e2e.sh tests/security-*.spec.ts
Más Información
- Seguridad - Autenticación - Sistema de autenticación
- Seguridad - Headers - Security headers
- Seguridad - Cookies - Seguridad de cookies
- Frontend - Testing - Guía completa de testing