Todas las actividades
Semanas 7–8· Laboratorio 3Entregado

Seguridad: Validación, Sanitización y Cabeceras

Investigación

OWASP Top 10XSS e inyecciónCabeceras HTTP de seguridad

Práctica

Validación con Zod, sanitización con DOMPurify y auditoría de cabeceras HTTP.

Entregables

  • Playground de sanitización y auditor de cabeceras

Dónde vive en el producto

Laboratorio 3 · Mecanismo de Defensa en Profundidad

Validación Estricta de Esquemas (Zod) + Sanitización DOM (DOMPurify)

En un mercado de arte C2C como DopamINK, creadores y compradores intercambian pliegos de comisión, advertencias de contenido y términos estilísticos. Este laboratorio ilustra cómo desacoplar la validación de tipado de la neutralización activa de vectores XSS sin romper el formato legítimo.

Pliegos de Prueba Preconfigurados:

Payload Entrante (JSON Crudo Sin Sanitizar)
Endpoint: POST /api/security/validate-sanitize
Esquema Zod
En espera
Amenazas XSS
En espera
Latencia Filtro
—en Edge

Listo para evaluar el pliego

Selecciona uno de los escenarios preconfigurados o edita el JSON libremente a la izquierda, y presiona "Ejecutar Validación" para inspeccionar la neutralización activa.

OWASP Secure Headers Project Compliance

Inspección Activa de Cabeceras HTTP de Seguridad

Verificación en tiempo real de las cabeceras inyectadas tanto en next.config.ts como en el Edge Middleware. Blindan los acuerdos de depósito, evitan Clickjacking y previenen la inyección de scripts externos.

A+
Calificación Global
100 / 100

9/9 Cabeceras Activas

$curl -I http://localhost:3000/api/security/headers
Comandos de Demostración Local

Guía de Pruebas Automatizadas con cURL

Comandos listos para ejecutar directamente desde la terminal (PowerShell, Bash o Zsh) para verificar las cabeceras de respuesta y la sanitización en el entorno de desarrollo local.

1. Inspeccionar Cabeceras de Seguridad HTTP (curl -I)

Audita las cabeceras HTTP emitidas por Next.js para comprobar CSP, X-Frame-Options, HSTS y nosniff.

curl -I http://localhost:3000/api/security/headers

2. Probar Sanitización y Neutralización de XSS (POST)

Envía un payload malicioso con <script> y manejadores onerror. El endpoint neutraliza los vectores antes del almacenamiento.

curl -X POST http://localhost:3000/api/security/validate-sanitize \
  -H "Content-Type: application/json" \
  -d '{
    "payloadType": "COMMISSION",
    "data": {
      "title": "Ataque XSS <script>alert(1)</script>",
      "creatorId": "usr_art_jinx99",
      "fandom": "Arcane",
      "trope": "Cyberpunk-AU",
      "instructions": "Inyección: <img src=x onerror=alert(document.cookie)>",
      "contentWarnings": ["spoiler"],
      "budgetUsd": 120,
      "clientEmail": "attacker@exploit.com"
    }
  }'

3. Probar Rechazo de Esquema por Zod (Error 422)

Envía valores que violan los límites del esquema (presupuesto negativo, correo inválido, ID sin formato usr_).

curl -X POST http://localhost:3000/api/security/validate-sanitize \
  -H "Content-Type: application/json" \
  -d '{
    "payloadType": "COMMISSION",
    "data": {
      "title": "Ab",
      "creatorId": "bad_id",
      "fandom": "A",
      "trope": "T",
      "instructions": "Corta",
      "budgetUsd": -50,
      "clientEmail": "correo_sin_arroba"
    }
  }'

4. Firmar Hito en Ledger Blockchain PoHW (POST)

Simula la atestación de evidencias de trabajo humano y cálculo del Merkle Root.

curl -X POST http://localhost:3000/api/blockchain/transact \
  -H "Content-Type: application/json" \
  -d '{
    "commissionId": "comm_fandom_9812",
    "milestoneId": "mstone_render_final",
    "creatorId": "usr_art_jinx99",
    "buyerId": "usr_buy_zaunite",
    "step": "FINAL_RENDER",
    "pohwEvidence": {
      "evidenceType": "LAYERED_PSD",
      "sourceFileUri": "s3://evidence-vault/comm_9812/render_full.psd",
      "layerCount": 54,
      "rawPayloadSignature": "0x4a7f28e1c6b39d05e2fa9b425167cd98a123f4b5e6a7d8c9b0e1f2a3c4b5d6e7"
    },
    "amountCents": 4500
  }'

5. Consultar Motor de Recomendación por Fandom (POST)

Recibe preferencias de fandom y calcula afinidad ponderada por Proof of Human Work.

curl -X POST http://localhost:3000/api/recommendations \
  -H "Content-Type: application/json" \
  -d '{
    "fandoms": ["Arcane", "Cyberpunk"],
    "preferredTropes": ["Found-Family", "Cyberpunk-AU"],
    "preferredFormat": "FANART"
  }'