# SECURITY_CHECKLIST.md

## Lista de Verificación de Seguridad

### Headers HTTP
- [x] `X-Content-Type-Options: nosniff`
- [x] `X-Frame-Options: DENY`
- [x] `X-XSS-Protection: 1; mode=block`
- [x] `Referrer-Policy: strict-origin-when-cross-origin`
- [x] `Permissions-Policy: camera=(), geolocation=(), microphone=(), payment=()`
- [x] `Content-Security-Policy` configurada vía PHP

### Autenticación
- [x] JWT con expiración (TTL configurable)
- [x] Refresh tokens con rotación
- [x] Rate limiting en login (5 intentos por ventana)
- [x] Bloqueo de cuenta por intentos fallidos
- [x] Hash de contraseñas con bcrypt
- [x] Política de expiración de contraseñas (90 días)

### API
- [x] Middleware de autenticación JWT en rutas protegidas
- [x] Middleware de rate limiting por endpoint
- [x] Middleware CSRF para métodos mutantes
- [x] CORS configurado con orígenes específicos
- [x] Headers de seguridad inyectados vía PHP
- [x] Validación de permisos por rol en cada endpoint

### Base de datos
- [x] Consultas parametrizadas (PDO prepared statements)
- [x] Usuario de BD con permisos mínimos
- [x] Charset utf8mb4 (protección contra XSS/inyección Unicode)
- [x] Emulate prepares desactivado

### Archivos
- [x] Subidas validadas por tipo MIME
- [x] Extensiones permitidas configuradas
- [x] Ejecución de PHP bloqueada en directorio uploads
- [x] Nombres de archivo sanitizados

### Deploy
- [ ] SSL/HTTPS obligatorio (configurar en cPanel)
- [ ] JWT_SECRET cambiado del valor por defecto
- [ ] APP_DEBUG=false en producción
- [ ] Archivo .env no accesible públicamente
- [ ] Logs de errores PHP desactivados (display_errors=Off)
- [ ] logs_errors=On, error_log especificado
- [ ] Directorio de subidas fuera del document root (opcional)
- [ ] Backups cifrados
