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: 31 tests ✅
- Tests pasando: 31 (100%) ✅
- Tests fallando: 0 (0%) ✅
- Cobertura: 100% de medidas de seguridad críticas ✅
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');
});
Ejecutar Tests de Seguridad
Desde Script
./scripts/test_frontend_security.sh
Desde Docker
docker compose exec frontend npx playwright test \
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
docker compose exec frontend npx playwright test 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: |
docker compose exec frontend npx playwright test 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