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 -> IntegracionesSi una validación falla, el flujo se detiene y no se continúa con la lógica de negocio.

Controles actuales
Sección titulada «Controles actuales»| Control | Estado | Aplica a | Objetivo |
|---|---|---|---|
| API Key SHA-256 | Implementado | GET / POST | Autenticar consumidor. |
| Origin validation | Implementado condicional | GET / POST | Restringir dominios autorizados cuando el header Origin viene informado. |
| CSRF stateful | Implementado | POST | Proteger envíos de formulario. |
| Validación de datos | Implementado | POST | Validar requeridos, formatos y tipos. |
| Admin Key SHA-256 | Implementado | Admin endpoints | Proteger consultas administrativas. |
| Rate limiting | Implementado básico | POST submit | Reducir abuso del endpoint. |
| HTTPS obligatorio | Pendiente fuera de local | Staging / Producción | Proteger tráfico. |
| CORS endurecido | Pendiente | Staging / Producción | Restringir origen a nivel HTTP. |
| Origin obligatorio | Pendiente | Staging / Producción | Bloquear requests de navegador sin Origin cuando aplique. |
Orden de validación
Sección titulada «Orden de validación»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.API Key
Sección titulada «API Key»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:
ca6f2e39b2ff141859b18bb5283aadd5093c8ede2869f3656231a054e54bfc22SQL de referencia para demo:
UPDATE ConsumersSET ApiKeyHash = 'ca6f2e39b2ff141859b18bb5283aadd5093c8ede2869f3656231a054e54bfc22'WHERE Code = 'demo';Validaciones
Sección titulada «Validaciones»| Validación | Resultado si falla |
|---|---|
Header X-Api-Key existe. | 401 Unauthorized |
| API Key coincide con hash almacenado. | 401 Unauthorized |
| Consumer está activo. | 401 Unauthorized |
Origin validation
Sección titulada «Origin validation»La API valida el header:
Origin: https://localhost:7122Cuando el header viene informado, el valor debe coincidir exactamente con un registro activo en AllowedOrigins.
Ejemplos válidos:
https://localhost:7122https://app.interzone.netEjemplos incorrectos:
https://app.interzone.net/formulariohttp://localhost/CentralForms.ApiCSRF stateful
Sección titulada «CSRF stateful»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>Validaciones
Sección titulada «Validaciones»| Validación | Resultado 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.
Admin Key
Sección titulada «Admin Key»Los endpoints administrativos usan:
X-Admin-Key: <admin_key>El valor configurado debe ser hash SHA-256:
{ "Admin": { "ApiKeyHash": "ac5bb3526d3be432ba19fb1fc0712d350c160bd2169cd24401c9fcaeaac2d860" }}Rate limiting
Sección titulada «Rate limiting»El endpoint de submit usa una política básica:
60 requests por minutoqueue 0respuesta 429 al exceder límiteAplica a:
POST /api/forms/{consumerCode}/{formCode}/submitActualmente CORS está configurado de forma amplia para facilitar pruebas e integración con el SDK:
AllowAnyOriginAllowAnyMethodAllowAnyHeaderLa protección principal se aplica con:
API Key + Origin + CSRFEn 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ódigos de seguridad
Sección titulada «Códigos de seguridad»| Código | Caso |
|---|---|
400 Bad Request | Datos inválidos o campos requeridos faltantes. |
401 Unauthorized | API Key ausente o inválida. |
403 Forbidden | Origin no autorizado o CSRF inválido. |
429 Too Many Requests | Rate limit superado. |
500 Internal Server Error | Error inesperado de servidor. |
Datos sensibles
Sección titulada «Datos sensibles»| Dato | Almacenamiento recomendado | Control |
|---|---|---|
| API Key real | No almacenar texto plano | Hash SHA-256 |
| Admin Key real | No almacenar texto plano | Hash SHA-256 / secrets |
| Password SMTP | No versionar | Variables de entorno o secretos |
| Connection string productiva | No versionar con credenciales reales | Variables de entorno o secreto |
| Submission data | Base de datos | Control de acceso y retención |
| CSRF token | Base de datos temporal | Expiración y uso único |
Reglas de seguridad
Sección titulada «Reglas de seguridad»- 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
AllowedOriginspor 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
Origindebe ser obligatorio para requests públicos en staging/producción.
Pendientes
Sección titulada «Pendientes»| Pendiente | Prioridad |
|---|---|
| Rotación formal de API Keys | Alta |
| Gestión administrativa de claves | Alta |
| Autenticación admin con usuarios y roles | Alta |
| Auditoría de acciones administrativas | Alta |
| Rate limiting por consumer, IP u origin | Media |
| Logs de seguridad dedicados | Media |
| Secret manager para producción | Alta |
| HTTPS obligatorio en ambientes reales | Alta |
| CORS restringido por ambiente | Media |