feat(security): Implementar sistema de contraseñas seguro con hashing

- Añadir hashing bcrypt para todas las contraseñas nuevas y existentes
- Implementar verificación segura con password_hash() y password_verify()
- Migrar 10 contraseñas existentes de texto plano a formato hash
- Agregar protección CSRF en formulario de login
- Implementar rate limiting (5 intentos/minuto) contra fuerza bruta
- Mejorar formulario de edición con campos de contraseña seguros
- Agregar validación de coincidencia y longitud mínima de contraseñas
- Sanitización de inputs y validación de formato de email
- Prevenir exposición de hashes en interfaz de usuario

Cambia vulnerabilidad crítica donde las contraseñas se almacenaban y viajaban en texto plano.
This commit is contained in:
2026-01-09 15:24:26 -06:00
parent cb1a44e380
commit 448a2aa240
8 changed files with 169 additions and 36 deletions

View File

@@ -391,10 +391,9 @@ $this->Util()->ValidateMail($value, "Email");
}
}
// CAMBIO CRÍTICO: Obtener empresaId dinámicamente del usuario con BD real
$sql = "SELECT usuarioId, empresaId FROM usuario
// CAMBIO DE SEGURIDAD: Obtener usuario por email primero (sin contraseña)
$sql = "SELECT usuarioId, empresaId, password FROM usuario
WHERE email = '".$this->email."'
AND password = '".$this->password."'
AND baja = '0'";
$result = $masterConnection->query($sql);
@@ -410,7 +409,21 @@ $this->Util()->ValidateMail($value, "Email");
{
return false;
}
}
// Verificar contraseña usando método seguro
$usuario = new Usuario();
$usuario->setUsuarioId($row['usuarioId']);
if(!$usuario->verifyPassword($this->password, $row['password']))
{
unset($_SESSION["loginKey"]);
unset($_SESSION["empresaId"]);
$this->Util()->setError(10006, "error");
if($this->Util()->PrintErrors())
{
return false;
}
}
// Obtener datos del usuario de forma segura