Skip to content

Security: jdmarinv/assistlist

Security

SECURITY.md

Guía de seguridad — AssistList

Este documento describe las medidas de seguridad implementadas en el proyecto y cómo configurar el entorno de forma segura.


1. Configuración de Credenciales (.env)

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.

Configuración

Copia el ejemplo y llena tus valores reales:

cp .env.example .env

Contenido del .env:

DB_HOST=localhost
DB_USER=tu_usuario
DB_PASS=tu_contraseña_segura
DB_NAME=assistlist

2. Autenticación y Contraseñas

  • Las contraseñas se almacenan con bcrypt (password_hash($pass, PASSWORD_DEFAULT)).
  • La verificación se hace con password_verify().

Migración de usuarios existentes

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.


3. Protección contra SQL Injection

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().


4. Protección contra XSS (Cross-Site Scripting)

Toda salida de datos hacia HTML utiliza Core::h($valor), que internamente llama a htmlspecialchars($str, ENT_QUOTES, 'UTF-8').


5. Protección contra CSRF (Cross-Site Request Forgery)

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.


6. Configuración de Producción

  • 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 .htaccess si usas Apache:
<Files ".env">
    Order allow,deny
    Deny from all
</Files>

7. Sesiones

  • 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.

There aren't any published security advisories