Autor: Iker Acevedo¶
Fecha creacion: 2026-10-17 Estado: propuesta (pendiente de aprobación) Tipo: estándar obligatorio
Seguridad por diseño¶
Todo lo que se construya para el Sistema de Experiencias, y toda vista que se migre a él, cumple estas reglas. Son obligatorias: un PR que no las cumpla no se aprueba. El modelo general de autorización está en Seguridad y accesos.
Principio¶
Una experiencia solo pinta. La seguridad vive en el servidor. Ocultar un botón, un menú o una columna es experiencia de usuario, nunca un control de seguridad.
Frontend¶
| # | Regla |
|---|---|
| F1 | Las versiones visuales y los shells no deciden permisos: los leen del facade, que a su vez los toma del backend (o, mientras tanto, de un único archivo de permisos de la vista) |
| F2 | Ningún dato que el usuario no pueda ver debe llegar al navegador. Si hay que ocultarlo, se pide al backend que no lo envíe |
| F3 | Nada de innerHTML, bypassSecurityTrust* ni HTML construido con texto del usuario o del API |
| F4 | En localStorage solo el id de la experiencia y el tema. Nunca tokens, roles, tiendas ni datos personales en código nuevo |
| F5 | Sin secretos en environment.ts: todo lo que está en el bundle es público |
| F6 | Sin scripts, estilos ni fuentes desde CDN o desde la base de datos en las experiencias |
| F7 | Las preferencias que llegan del servidor se validan contra el registro (id conocido y estado disponible) antes de usarse |
| F8 | Dependencias nuevas con versión fija y revisadas (npm audit en CI) |
| F9 | Los errores se muestran con mensajes genéricos; los detalles técnicos no se muestran al usuario |
Backend (endpoints nuevos de este sistema)¶
| # | Regla |
|---|---|
| B1 | Toda ruta nueva va en el API REST con authorizer Cognito. Ninguna ruta nueva con autorización NONE |
| B2 | La identidad sale del sub del token validado. Nunca de un email, Tienda o roles enviados por el cliente |
| B3 | Endpoints específicos por caso de uso. Prohibido usar el CRUD genérico (metodoGenerico) para funcionalidades nuevas |
| B4 | Validación estricta de entrada: lista cerrada de campos (UnmappedMemberHandling.Disallow), tipos, longitudes y tamaños máximos |
| B5 | Rol IAM propio por Lambda con mínimo privilegio, como ApiLambdaPublicarReporteAnalytics |
| B6 | Logs sin tokens, headers completos ni datos personales: solo códigos de error e identificadores técnicos |
| B7 | CORS limitado a los dominios de la plataforma |
| B8 | Respuestas de error con códigos estables (IDENTIDAD_AUSENTE, VALIDACION), sin mensajes internos ni trazas |
| B9 | Pruebas de seguridad del caso de uso: sin token, token de otro usuario, entrada inválida, entrada demasiado grande |
| B10 | Infraestructura en Terraform; nada creado a mano en la consola |
Revisión de PR¶
Todo PR del sistema incluye en su descripción:
- [ ] Cumple F1 a F9 (frontend) y B1 a B10 (si toca backend).
- [ ] No usa
metodoGenericoen código nuevo. - [ ] Las pruebas de seguridad del caso de uso pasan.
Historial de cambios¶
| Fecha | Autor | Cambio |
|---|---|---|
| 2026-10-17 | Iker Acevedo | Creación de la propuesta |