Cómo se protege el sistema
La seguridad de esta plataforma no es una lista de intenciones: cada control descrito aquí está implementado en el código y se puede comprobar.
Y lo que falta también se dice.
Cuentas y contraseñas
Almacenamiento de contraseñas
Se guardan con password_hash del propio PHP, algoritmo bcrypt y coste 12. Nunca en texto plano, nunca con MD5 ni SHA1.
Verificación en dos pasos
Segundo factor por aplicación de códigos temporales, con códigos de recuperación que se consumen al usarse.
Dispositivos de confianza
Se puede marcar un equipo para no repetir el segundo factor, y revocarlo después uno a uno o todos a la vez.
Baneos con caducidad
Un baneo puede ser temporal o indefinido, queda registrado con su motivo y su autor, y caduca solo.
Sesiones y formularios
Cookies de sesión
La cookie de sesión se emite con HttpOnly y SameSite, de modo que el JavaScript de la página no puede leerla ni enviarla desde otro sitio.
Protección de formularios
Toda operación que cambia datos exige un token CSRF emitido por el servidor. Sin él, la petición se rechaza.
Límite de intentos
El acceso, el registro, la recuperación de contraseña y el segundo factor tienen límite de peticiones por ventana de tiempo.
Base de datos
Todas las consultas usan sentencias preparadas con parámetros enlazados. La aplicación se conecta con un usuario que solo tiene permiso de lectura y escritura sobre su propia base, sin privilegios de administración.
Trazabilidad
Auditoría
Cada acción relevante queda registrada con su autor, su fecha y su origen, y puede exportarse.
Registro de accesos
Los intentos fallidos se contabilizan y se pueden consultar por cuenta y por dirección, con opción de bloquear.
Lo que todavía falta
La plataforma está en desarrollo activo. Antes de abrirla al público conviene saber que:
- No se emiten todavía cabeceras
Content-Security-PolicyniStrict-Transport-Security. - Las dependencias de interfaz se cargan desde un CDN sin atributo de integridad.
- La autorización por permiso se comprueba de forma desigual en algunos módulos, así que no se debe dar acceso al panel a personas de poca confianza solo por asignarles un rol.