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 (E2E): 31+ tests ✅
  • Tests unitarios adicionales: backend tests/core/test_security.py + frontend src/__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('&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');
});

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

  1. 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)
  2. 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)
  3. 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 PASSWORD o Password)

Ejecución

# Ejecutar suite de seguridad backend
./scripts/test_backend.sh tests/security/
  1. 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

  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: |
./scripts/test_e2e.sh tests/security-*.spec.ts

Más Información