Aislamiento por tenant
- Toda query B2B filtra por
tenantId; las policies de Row Level Security de Supabase garantizan el aislamiento en la base de datos. - Las claves de API por tenant, las credenciales de proveedores de video/avatar y los tokens OAuth se cifran en reposo con AES-256-GCM.
- La impersonación de soporte utiliza una cookie httpOnly firmada HMAC, de corta duración (1h), y es un overlay en memoria — el auth de Supabase nunca se modifica. Todo inicio/fin de impersonación queda auditado.
Secretos & OAuth
- El OAuth state está firmado HMAC-SHA256 (
OAUTH_STATE_SECRET) con nonce Redis (anti-replay, TTL 15min) en todoconnecty se valida contra la sesión en todocallback. - Las contraseñas de enlaces de medios compartidos se almacenan como
salt:hashmediante scrypt, con rate limit en los intentos.
Uploads & seguridad de contenido
- El
storageUrlde upload debe comenzar con el prefijo público de storage de Supabase, de lo contrario se rechaza con 422. - Las entregas de assignment se almacenan en un bucket privado con prefijo validado (
{tenantId}/{courseId}/{lessonId}/{userId}/); las descargas utilizan URLs firmadas temporales con verificación de ownership. - El HTML de usuarios/LLMs se sanea server-side (DOMPurify) antes de cualquier
dangerouslySetInnerHTML, incluido el HTML servido a la app móvil. - El input se valida con Zod en las rutas POST/PATCH; la prevención de SSRF bloquea IPs privadas IPv4/IPv6 y metadata endpoints.
Moderación
Un supervisor de chat IA clasifica los turnos del tutor (severidad + categoría) en background y puede advertir o poner en cuarentena; las señales de autolesión activan un flujo de safety no punitivo con recursos de crisis y notificación urgente al admin.
LGPD / privacidad
- Export (Art. 18 IV):
GET /api/user/data-exportdevuelve todos los datos del usuario en JSON, rate limit de 1 req por 24h (cooldown Redis). - Eliminación (Art. 18 VI):
DELETE /api/user/accountanonimiza PII y elimina los datos conversacionales, pero mantiene los datos de aprendizaje (notas, finalizaciones, intentos de quiz) por ~5 años de retención fiscal (Art. 16 I). - Páginas públicas
/privacyy/termsaccesibles sin autenticación. - La observabilidad vía Sentry utiliza Replay con texto enmascarado y medios bloqueados para LGPD.
Auditoría
Las acciones administrativas sensibles (impersonación, cambio de plan/configuración, pagos manuales, cambio de rol) se registran en un audit log administrativo inmutable con IP y user-agent.