La base no tiene salida a internet
Postgres y el almacenamiento de fotos viven en una red interna sin ruta hacia afuera. Ni siquiera de salida: aunque algo corriera ahí adentro, no tendría a dónde mandar nada.
Seguridad y datos
Es el único error capaz de matar un producto como este, así que no depende de que el código esté bien escrito. Está sostenido por tres capas independientes, y la última la aplica la base de datos.
01Aislamiento
Tres capas que tendrían que fallar a la vez para que un taller vea una sola fila de otro.
Toda tabla del sistema guarda a qué taller pertenece cada fila, y ese dato no puede quedar vacío. No es una convención: la base lo exige.
Cada consulta se ejecuta con la identidad del taller activo y Postgres aplica políticas que descartan cualquier fila de otro. Si el programador olvidara el filtro, la consulta devuelve cero resultados en lugar de datos de otro taller: falla cerrada, no abierta.
Boxxi se conecta a la base con un usuario que no puede saltearse esas políticas ni siquiera queriendo. Es el detalle que hace que la protección sea real y no decorativa: el dueño de una tabla siempre la ve completa, así que la aplicación no es dueña de ninguna.
02Infraestructura
Lo que hay alrededor de la aplicación, que es donde suelen pasar los problemas.
Postgres y el almacenamiento de fotos viven en una red interna sin ruta hacia afuera. Ni siquiera de salida: aunque algo corriera ahí adentro, no tendría a dónde mandar nada.
El servicio que factura contra ARCA es el único que tiene los certificados del taller, corre aislado y no publica ningún puerto. No se puede llegar a él desde internet.
Mínimo de diez caracteres, con límite de intentos por email y por dirección IP. Estas cuentas dan acceso a datos fiscales de terceros y a la capacidad de facturar en nombre del taller: ocho caracteres no alcanzan.
TLS obligatorio, HSTS y cabeceras de seguridad estrictas. La aplicación no se puede incrustar en un sitio de un tercero.
03Compromisos
Lo damos completo, sin vueltas: arquitectura, dónde se guarda cada cosa y cómo se exporta. Escribinos y lo repasamos con quien haga falta.