Saltar al contenido principal

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('&lt;script&gt;'); // 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

  1. Cubrir todos los vectores de ataque

    • XSS, CSRF, SQL Injection, etc.
    • Autenticación y autorización
    • Rate limiting y DoS
  2. Testear casos edge

    • Tokens expirados
    • Sesiones concurrentes
    • Ventanas privadas
    • Cookies malformadas
  3. Validar comportamiento del frontend

    • Mensajes de error apropiados
    • Manejo de rate limiting
    • Redirecciones seguras
  4. 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