Seguridad
Reglas impuestas por la base de datos, la protección de la demo, redirecciones seguras, la protección de URL y concesiones firmadas de la tienda.
Reglas en la base de datos
Las reglas más importantes las impone Postgres (seguridad a nivel de fila, concesiones de columna, disparadores y restricciones de comprobación), de modo que un fallo de la aplicación o un agente que se porte mal no puede romperlas. En resumen:
- El estado de facturación solo lo escribe la tienda.
- Los módulos bloqueados, desactivados o en
noneno devuelven ninguna fila. - Lanzar, aprobar, abortar y enviar órdenes al vehículo exigen
publish, quedan registrados como quien llama de verdad y nunca son posibles para los agentes. - No hay lanzamiento con una unidad inmovilizada, una reserva de batería baja o una altitud por encima del límite sin una exención.
- El retorno al servicio necesita una segunda persona (cuatro ojos).
- Los registros de vuelo son de solo adición; las notificaciones solo pueden marcarse como leídas; las entradas de auditoría no se pueden falsificar.
- Solo los propietarios y los administradores cambian el acceso; los agentes nunca pasan de
edit.
La lista completa, con cómo se impone cada regla, está en Invariantes. Cada regla tiene una prueba que intenta romperla.
Protección de la demo
El modo demo no tiene inicio de sesión, así que nunca debe servir un despliegue de producción por accidente. Si DEMO_MODE=true y NODE_ENV=production, la aplicación lanza un error al arrancar, salvo que ALLOW_DEMO_IN_PROD=true esté definido de forma explícita.
Redirecciones seguras
Cualquier parámetro next o de retorno pasa por safeRedirect. Solo acepta rutas relativas del mismo origen: una sola barra inicial, sin //, sin barra invertida, sin esquema y sin caracteres de control. Cualquier otra cosa vuelve a /app. Esto impide las redirecciones abiertas después del inicio de sesión.
Protección de URL
Las URL que aporta el usuario y que el servidor iría a obtener pasan por una protección de URL que rechaza direcciones privadas, de bucle local, de enlace local y otras direcciones reservadas. En esta compilación, la única URL de ese tipo es el destino de envío de la tienda, que sale de la configuración.
Concesiones firmadas de la tienda
La tienda demo del sitio firma cada habilitación con HMAC-SHA256 sobre un cuerpo JSON canónico (pedido, espacio de trabajo, módulos, gama, complemento de IA, fin del periodo y hora de emisión), con un secreto compartido de al menos 16 caracteres. La aplicación:
- comprueba el formato de la firma,
- rechaza las concesiones emitidas más de 5 minutos antes o después del momento actual (ventana de repetición),
- vuelve a calcular la firma y la compara en tiempo constante,
- solo entonces escribe las columnas de facturación con el rol de servicio.
Una concesión que falla en cualquier paso no cambia nada.
Secretos
En esta compilación no hacen falta ni se usan claves reales. Los archivos .env están ignorados por git. La contraseña de la base de datos local es solo local.
Funciones de IA
Una página de IA por módulo. Hoy son vistas previas basadas en reglas; todavía no se llama a ningún modelo.
Precios
Precios por módulo, desde una gama Hobby de pago de un solo puesto hasta Fleet, el Ops Suite, el complemento de IA y los paquetes sectoriales. Cada plan es un plazo de 12 meses facturado anualmente, sin reembolsos. No hay gama gratuita.