- 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.
194 lines
5.1 KiB
PHP
Executable File
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);
|
|
|
|
?>
|