Funciona en producción y se puede comprobar.
Separación de datos por empresa en la base, no en la pantalla
Cada tabla con datos de clientes tiene políticas de seguridad a nivel de fila en PostgreSQL. La empresa se fija en el contexto de la conexión, así que una consulta mal escrita no puede devolver datos de otra empresa: la base los filtra antes de que el código los vea. No depende de que una pantalla esconda un menú.
Las contraseñas no se guardan
Se guarda un hash con bcrypt. Ni Progresa puede leer tu contraseña, y por eso cuando se olvida se restablece en vez de reenviarse. Las invitaciones de acceso nunca llevan una contraseña escrita: llevan un enlace de un solo uso para que la fijes tú.
Segundo factor para administradores
Códigos temporales según el estándar RFC 6238, los mismos que usan Google Authenticator y Authy. La verificación compara en tiempo constante para no filtrar información por cuánto tarda, y hay códigos de recuperación de un solo uso.
El correo se verifica antes de dar acceso
Una cuenta de Google o Microsoft no se vincula a un usuario existente por tener el mismo correo si ese correo no está verificado. Es la vía por la que alguien tomaría una cuenta ajena registrando un correo parecido.
La auditoría no se puede reescribir
Las tablas de registro tienen disparadores que rechazan el cambio y el borrado de una fila ya escrita. Quien tenga acceso a la base tampoco puede borrar su propio rastro sin dejar constancia.
Los límites del plan se aplican en el servidor
Cuántos usuarios, cuántas respuestas de IA y cuántos contactos trae cada plan está en una sola tabla que usan la página de precios, el cobro y el código que autoriza cada acción. Esconder un botón no es un límite.
Los formularios públicos tienen freno
Dos ventanas de tiempo por dirección de origen, un campo trampa y un tiempo mínimo de llenado. Sin esto, cualquiera con un bucle de diez líneas llena el embudo de basura y quema la cuota de correo.
Los secretos no viajan al navegador
Las claves de los servicios externos viven en variables de entorno del servidor. Lo que se sirve al navegador no las contiene, y no se escriben en los registros.