Seguridad: Validación, Sanitización y Cabeceras
Investigación
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
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:
POST /api/security/validate-sanitizeListo 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.
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.
9/9 Cabeceras Activas
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"
}'