Este documento describe las medidas de seguridad implementadas y las mejores prácticas para mantener la aplicación segura.
- Algoritmo: Argon2ID (ganador del Password Hashing Competition)
- Configuración:
- Memory cost: 65536 KB (64 MB)
- Time cost: 4 iteraciones
- Parallelism: 3 threads
- Salt: Generado automáticamente por PHP
- Ubicación: src/Models/User.php
password_hash($password, PASSWORD_ARGON2ID, [
'memory_cost' => 65536,
'time_cost' => 4,
'threads' => 3
]);- Todas las consultas usan prepared statements
- Nunca se concatena SQL con valores de usuario
- Implementado en src/Repositories/BaseRepository.php
Ejemplo seguro:
$stmt = $this->db->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(['email' => $email]);❌ NUNCA hacer:
$query = "SELECT * FROM users WHERE email = '" . $email . "'";- Todo input es sanitizado en src/Validators/Validator.php
- Uso de
htmlspecialchars()conENT_QUOTES - Validación de patrones peligrosos
- Todas las vistas usan
htmlspecialchars()para output - Content-Security-Policy headers configurados
- Implementado en src/Services/SecurityService.php
- Token único por sesión
- Verificado en todos los POST, PUT, DELETE
- Generación: src/Services/SecurityService.php
- Validación: src/Services/SecurityService.php
Uso en formularios:
<input type="hidden" name="csrf_token" value="<?= $csrf_token ?>">Verificación en controlador:
if (!$this->verifyCsrfToken()) {
// Rechazar petición
}session.cookie_httponly = 1(no accesible por JavaScript)session.use_only_cookies = 1(solo cookies, no URL)session.cookie_samesite = Strict(protección CSRF)session.cookie_secure = 1(solo HTTPS en producción)- Regeneración de ID cada 5 minutos
- Validación de User-Agent (prevención de hijacking)
- Implementado en autoload.php
- ID regenerado en login exitoso
- ID regenerado periódicamente
- Sesión destruida en logout
- Máximo 5 intentos de login fallidos
- Lockout de 15 minutos después del límite
- Rate limiting de 100 req/min por IP
- Implementado en src/Middleware/RateLimitMiddleware.php
Headers automáticamente establecidos en src/Services/SecurityService.php:
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), microphone=(), camera=()
Content-Security-Policy: default-src 'self'; ...
- Validación en tiempo real con JavaScript
- Prevención de caracteres peligrosos
- Implementado en public/js/validation.js
- Validación robusta en servidor
- No se confía en validación del cliente
- Implementado en src/Validators/Validator.php
Protección implementada:
- Sistema RBAC (Role-Based Access Control)
- Verificación de permisos en cada endpoint
- Middleware de autenticación y autorización
Protección implementada:
- Argon2ID para contraseñas
- Tokens aleatorios criptográficamente seguros
- Sesiones con configuración segura
Protección implementada:
- Prepared statements (SQL Injection)
- Sanitización de entrada (XSS, Command Injection)
- Validación de tipos de datos
Protección implementada:
- Arquitectura basada en patrones de diseño
- Separación de responsabilidades (MVC)
- Principio de menor privilegio
Protección implementada:
- Headers de seguridad configurados
- Errores de PHP ocultos en producción
- Archivos sensibles protegidos
Protección implementada:
- Código sin dependencias externas vulnerables
- PHP 8+ con últimas características de seguridad
- Actualización regular recomendada
Protección implementada:
- Contraseñas fuertes requeridas
- Rate limiting en login
- Sesiones seguras
- Logout apropiado
Protección implementada:
- Validación de todos los inputs
- CSRF tokens
- Transacciones de base de datos
Protección implementada:
- Error logging configurado
- Logs de intentos fallidos de login
- No se expone información sensible en logs
Protección implementada:
- No se realizan requests externos con input de usuario
- Validación de URLs si se implementa
- Cambiar
'env' => 'production'en config.php - Cambiar
'debug' => falseen config.php - Cambiar todas las contraseñas por defecto
- Configurar
session.cookie_secure = 1 - Habilitar HTTPS (Let's Encrypt gratuito)
- Configurar backups automáticos
- Revisar permisos de archivos (755 directorios, 644 archivos)
- Deshabilitar listado de directorios
- Configurar firewall (UFW/iptables)
- Limitar acceso SSH (solo key-based)
- Actualizar PHP y MySQL a últimas versiones
- Configurar logs de acceso y errores
- Implementar monitoreo (opcional: New Relic, Datadog)
- Revisar logs semanalmente
- Actualizar PHP mensualmente
- Revisar intentos de login fallidos
- Verificar integridad de archivos
- Probar restauración de backups
- Revisar usuarios activos
- Auditar permisos asignados
Si encuentras una vulnerabilidad de seguridad:
- NO crear issue público
- Enviar email privado con detalles
- Incluir pasos para reproducir
- Esperar respuesta en 48 horas
- Nunca confiar en entrada de usuario
- Siempre validar en backend
- Nunca exponer información sensible en errores
- Siempre usar prepared statements
- Nunca logear contraseñas o tokens
- Siempre sanitizar output HTML
- Usar contraseñas únicas y fuertes (min 12 caracteres)
- Habilitar 2FA cuando esté disponible
- Revisar usuarios y permisos regularmente
- Mantener sistema actualizado
- Monitorear logs de acceso
- Realizar backups regulares
Se recomienda realizar auditorías de seguridad periódicas:
# Escaneo de vulnerabilidades PHP
composer require --dev roave/security-advisories:dev-latest
# Análisis estático de código
composer require --dev phpstan/phpstan
./vendor/bin/phpstan analyse src/
# Pruebas de penetración
# Contratar empresa especializada anualmenteMantener registro de parches de seguridad aplicados:
| Fecha | Versión | Descripción | Severidad |
|---|---|---|---|
| - | 1.0.0 | Versión inicial | - |
Última actualización: 2024 Próxima revisión: Trimestral