Files
ventas_php/modules/usuarios-editar.php
nickpons666 448a2aa240 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.
2026-01-09 15:24:26 -06:00

194 lines
5.1 KiB
PHP
Executable File

<?php
$empresa->AuthUser();
if($Usr['type'] != 'admin' && $Usr['type'] != 'direccion' && $Usr['type'] != 'gerente'){
header('Location: '.WEB_ROOT);
exit;
}
$usuarioId = intval($_GET['id']);
if(isset($_POST['type']) && $_POST['type'] == 'saveEditUsuario'){
$tipo = $_POST['tipo'];
$idSuc = $_POST['idSuc'];
$usuarioId = $_POST['usuarioId'];
$usuario->setUsuarioId($usuarioId);
$usuario->setTipo($tipo);
$usuario->setNombre($_POST['nombre']);
$usuario->setApellidos($_POST['apellidos']);
$usuario->setCalle($_POST["calle"]);
$usuario->setNoExt($_POST["noExt"]);
$usuario->setNoInt($_POST["noInt"]);
$usuario->setReferencia($_POST["referencia"]);
$usuario->setColonia($_POST["colonia"]);
$usuario->setLocalidad($_POST["localidad"]);
$usuario->setMunicipio($_POST["municipio"]);
$usuario->setEstado($_POST["estado"]);
$usuario->setPais($_POST["pais"]);
$usuario->setCodigoPostal($_POST["codigoPostal"]);
$usuario->setTelefono($_POST['telefono']);
$usuario->setCelular($_POST['celular']);
$usuario->setNoImss($_POST['noImss']);
$usuario->setCurp($_POST['curp']);
$usuario->setRfc($_POST['rfc']);
$usuario->setEmail($_POST['email']);
// 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();
//Guardamos las Sucursales si es Supervisor
if($tipo == 'supervisor'){
$usuario->DelSupSuc();
foreach($idSuc as $idSucursal){
$usuario->setUsuarioId($usuarioId);
$usuario->setSucursalId($idSucursal);
$usuario->SaveSucursal();
}
}
//Eliminamos la identificacion
$usuario->setUsuarioId($usuarioId);
if($_POST['delIdentificacion']){
$infU = $usuario->Info();
@unlink(DOC_ROOT.'/images/identificacion/'.$infU['identificacion']);
$usuario->setIdentificacion('');
$usuario->UpdateIdentificacion();
}
//Guardamos la identificacion
$ruta = DOC_ROOT.'/images/identificacion';
// obtenemos los datos del archivo
$tamano = $_FILES["identificacion"]['size'];
$tipo = $_FILES["identificacion"]['type'];
$archivo = $_FILES["identificacion"]['name'];
$nom = explode('.',$archivo);
$prefijo = substr(md5(uniqid(rand())),0,3);
$time = time();
if($archivo != ""){
$fileName = $usuarioId.'_'.$time.'.'.$nom[1];
$destino = $ruta.'/'.$fileName;
if (move_uploaded_file($_FILES['identificacion']['tmp_name'],$destino)) {
$infU = $usuario->Info();
@unlink(DOC_ROOT.'/images/identificacion/'.$infU['identificacion']);
$usuario->setUsuarioId($usuarioId);
$usuario->setIdentificacion($fileName);
$usuario->UpdateIdentificacion();
}
}//if
//Eliminamos la comprobante
$usuario->setUsuarioId($usuarioId);
if($_POST['delComprobante']){
$infU = $usuario->Info();
@unlink(DOC_ROOT.'/images/comprobante/'.$infU['comprobante']);
$usuario->setIdentificacion('');
$usuario->UpdateComprobante();
}
//Guardamos el comprobante
$ruta = DOC_ROOT.'/images/comprobante';
// obtenemos los datos del archivo
$tamano = $_FILES["comprobante"]['size'];
$tipo = $_FILES["comprobante"]['type'];
$archivo = $_FILES["comprobante"]['name'];
$nom = explode('.',$archivo);
$prefijo = substr(md5(uniqid(rand())),0,3);
$time = time();
if($archivo != ""){
$fileName = $usuarioId.'_'.$time.'.'.$nom[1];
$destino = $ruta.'/'.$fileName;
if (move_uploaded_file($_FILES['comprobante']['tmp_name'],$destino)) {
$infU = $usuario->Info();
@unlink(DOC_ROOT.'/images/productos/comprobante/'.$infU['comprobante']);
$producto->setImagen('');
$producto->UpdateImagen();
$usuario->setUsuarioId($usuarioId);
$usuario->setComprobante($fileName);
$usuario->UpdateComprobante();
}
}//if
$_SESSION['msgU'] = 'Updated';
header('Location: '.WEB_ROOT.'/usuarios');
exit;
}
$usuario->setUsuarioId($usuarioId);
$info = $usuario->Info();
$resSuc = $sucursal->GetSucursalesByEmpresaId();
$sucursales = array();
foreach($resSuc as $res){
$res['nombre'] = utf8_decode(urldecode($res['nombre']));
$usuario->setUsuarioId($usuarioId);
$usuario->setSucursalId($res['sucursalId']);
$res['checked'] = $usuario->IsSucChecked();
$sucursales[] = $res;
}
$smarty->assign('info', $info);
$smarty->assign('sucursales', $sucursales);
?>