Ir al contenido

Seguridad

IZ-CentralForms implementa seguridad por capas para proteger la exposición pública de formularios y el envío de submissions.

El flujo de seguridad actual es:

API Key -> Origin si viene informado -> CSRF -> Validación de datos -> Persistencia -> Integraciones

Si una validación falla, el flujo se detiene y no se continúa con la lógica de negocio.

Diagrama de flujo de seguridad

ControlEstadoAplica aObjetivo
API Key SHA-256ImplementadoGET / POSTAutenticar consumidor.
Origin validationImplementado condicionalGET / POSTRestringir dominios autorizados cuando el header Origin viene informado.
CSRF statefulImplementadoPOSTProteger envíos de formulario.
Validación de datosImplementadoPOSTValidar requeridos, formatos y tipos.
Admin Key SHA-256ImplementadoAdmin endpointsProteger consultas administrativas.
Rate limitingImplementado básicoPOST submitReducir abuso del endpoint.
HTTPS obligatorioPendiente fuera de localStaging / ProducciónProteger tráfico.
CORS endurecidoPendienteStaging / ProducciónRestringir origen a nivel HTTP.
Origin obligatorioPendienteStaging / ProducciónBloquear requests de navegador sin Origin cuando aplique.
1. Validar API Key.
2. Validar Origin cuando el header viene informado.
3. Validar CSRF, solo en POST.
4. Validar datos del formulario.
5. Persistir submission.
6. Ejecutar integraciones.

El consumidor envía la clave en cada solicitud pública:

X-Api-Key: <api_key>

La API calcula SHA-256 de la clave recibida y compara el resultado contra Consumers.ApiKeyHash.

Hash demo:

ca6f2e39b2ff141859b18bb5283aadd5093c8ede2869f3656231a054e54bfc22

SQL de referencia para demo:

UPDATE Consumers
SET ApiKeyHash = 'ca6f2e39b2ff141859b18bb5283aadd5093c8ede2869f3656231a054e54bfc22'
WHERE Code = 'demo';
ValidaciónResultado si falla
Header X-Api-Key existe.401 Unauthorized
API Key coincide con hash almacenado.401 Unauthorized
Consumer está activo.401 Unauthorized

La API valida el header:

Origin: https://localhost:7122

Cuando el header viene informado, el valor debe coincidir exactamente con un registro activo en AllowedOrigins.

Ejemplos válidos:

https://localhost:7122
https://app.interzone.net

Ejemplos incorrectos:

https://app.interzone.net/formulario
http://localhost/CentralForms.Api

El token CSRF se genera durante el GET del formulario y se usa durante el POST de submission.

Header requerido en POST:

X-CSRF-Token: <token_obtenido_en_GET>
ValidaciónResultado si falla
Token existe en base de datos.403 Forbidden
Token no expiró.403 Forbidden
Token no fue usado previamente.403 Forbidden
Token corresponde al consumer y formulario.403 Forbidden

Después de un POST exitoso, el token se marca como utilizado.

Los endpoints administrativos usan:

X-Admin-Key: <admin_key>

El valor configurado debe ser hash SHA-256:

{
"Admin": {
"ApiKeyHash": "ac5bb3526d3be432ba19fb1fc0712d350c160bd2169cd24401c9fcaeaac2d860"
}
}

El endpoint de submit usa una política básica:

60 requests por minuto
queue 0
respuesta 429 al exceder límite

Aplica a:

POST /api/forms/{consumerCode}/{formCode}/submit

Actualmente CORS está configurado de forma amplia para facilitar pruebas e integración con el SDK:

AllowAnyOrigin
AllowAnyMethod
AllowAnyHeader

La protección principal se aplica con:

API Key + Origin + CSRF

En local puede estar desactivada o flexibilizada la redirección HTTPS para facilitar pruebas.

En staging y producción debe ser obligatorio:

  • usar HTTPS;
  • activar redirección HTTPS si aplica;
  • instalar certificado válido;
  • evitar exponer formularios por HTTP.
CódigoCaso
400 Bad RequestDatos inválidos o campos requeridos faltantes.
401 UnauthorizedAPI Key ausente o inválida.
403 ForbiddenOrigin no autorizado o CSRF inválido.
429 Too Many RequestsRate limit superado.
500 Internal Server ErrorError inesperado de servidor.
DatoAlmacenamiento recomendadoControl
API Key realNo almacenar texto planoHash SHA-256
Admin Key realNo almacenar texto planoHash SHA-256 / secrets
Password SMTPNo versionarVariables de entorno o secretos
Connection string productivaNo versionar con credenciales realesVariables de entorno o secreto
Submission dataBase de datosControl de acceso y retención
CSRF tokenBase de datos temporalExpiración y uso único
  • No guardar API Keys ni Admin Keys en texto plano.
  • No versionar secretos productivos.
  • No exponer Swagger públicamente en producción.
  • No usar LocalDB en IIS.
  • Registrar solo los datos necesarios para operación.
  • Revisar AllowedOrigins por consumer.
  • Rotar claves cuando cambie una integración, dominio o responsable.
  • Revisar periódicamente errores de seguridad y patrones de abuso.
  • Activar HTTPS obligatorio fuera de local.
  • Definir si Origin debe ser obligatorio para requests públicos en staging/producción.
PendientePrioridad
Rotación formal de API KeysAlta
Gestión administrativa de clavesAlta
Autenticación admin con usuarios y rolesAlta
Auditoría de acciones administrativasAlta
Rate limiting por consumer, IP u originMedia
Logs de seguridad dedicadosMedia
Secret manager para producciónAlta
HTTPS obligatorio en ambientes realesAlta
CORS restringido por ambienteMedia