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

@@ -1,9 +1,15 @@
<?php
$db = new DB(true); // Usar master connection
$db->setQuery("SELECT * FROM empresa");
$result = $db->GetResult();
// Generar token CSRF para protección
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
$smarty->assign("empresas", $result);
$db = new DB(true); // Usar master connection
$db->setQuery("SELECT * FROM empresa");
$result = $db->GetResult();
?>
$smarty->assign("empresas", $result);
$smarty->assign("csrf_token", $_SESSION['csrf_token']);
?>

View File

@@ -35,7 +35,31 @@
$usuario->setCurp($_POST['curp']);
$usuario->setRfc($_POST['rfc']);
$usuario->setEmail($_POST['email']);
$usuario->setPassword($_POST['password']);
// Solo actualizar contraseña si se proporciona una nueva
$newPassword = trim($_POST['password']);
$confirmPassword = trim($_POST['password_confirm']);
if (!empty($newPassword)) {
// Validar que las contraseñas coincidan
if ($newPassword !== $confirmPassword) {
$smarty->assign("error", "Las contraseñas no coinciden");
$smarty->assign("info", $_POST);
$smarty->display('templates/forms/editar-usuario.tpl');
exit;
}
// Validar longitud mínima
if (strlen($newPassword) < 6) {
$smarty->assign("error", "La contraseña debe tener al menos 6 caracteres");
$smarty->assign("info", $_POST);
$smarty->display('templates/forms/editar-usuario.tpl');
exit;
}
$usuario->setPassword($newPassword);
}
$usuario->setSucursalId($_POST['sucursalId']);
$usuario->Update();