Este documento describe las medidas de seguridad implementadas en el proyecto y cómo configurar el entorno de forma segura.
Las credenciales de base de datos no están en el código fuente. Se leen desde un archivo .env en la raíz del proyecto.
El archivo .env está en .gitignore y nunca debe subirse al repositorio.
Copia el ejemplo y llena tus valores reales:
cp .env.example .envContenido del .env:
DB_HOST=localhost
DB_USER=tu_usuario
DB_PASS=tu_contraseña_segura
DB_NAME=assistlist
- Las contraseñas se almacenan con bcrypt (
password_hash($pass, PASSWORD_DEFAULT)). - La verificación se hace con
password_verify().
Los usuarios creados con el hash antiguo (sha1(md5(...))) son migrados automáticamente al hacer su primer login con el nuevo sistema. No se requiere ninguna acción manual.
Todas las consultas que reciben datos del usuario utilizan MySQLi Prepared Statements a través de Executor::doitSafe($sql, $types, $params).
Solo las consultas internas sin parámetros del usuario (ej. getAll()) continúan usando Executor::doit().
Toda salida de datos hacia HTML utiliza Core::h($valor), que internamente llama a htmlspecialchars($str, ENT_QUOTES, 'UTF-8').
Todos los formularios POST incluyen un campo oculto con un token de sesión:
<input type="hidden" name="csrf_token" value="<?= Core::csrfToken(); ?>">Cada action verifica el token al inicio con Core::csrfVerify(). Si el token es inválido o no existe, la petición se rechaza con HTTP 403.
- El modo debug está desactivado en
index.php($debug = false). - Asegúrate de que tu servidor web no sirva el archivo
.env. Agrega esto a tu.htaccesssi usas Apache:
<Files ".env">
Order allow,deny
Deny from all
</Files>- Al hacer login exitoso, se llama a
session_regenerate_id(true)para prevenir ataques de Session Fixation. - Al hacer logout, la sesión se destruye completamente.