微前端沙箱不提供负载均衡规则,所谓“非法篡改”实为前端路由规则变量(如window.__route_map__)被非法写入;应通过proxy+setter校验路径合法性、应用白名单及调用权限,并禁用eval等逃逸通道,最终推荐由主应用统一管控路由注册。

微前端沙箱本身不提供“负载均衡规则”这一概念,也不存在原生的「过滤模块」用于拦截此类篡改——因为负载均衡是服务端网关(如 Nginx、Kong、Spring Cloud Gateway)或基础设施层的职责,不属于前端 JS 沙箱的管控范围。
你提到的“非法负载均衡规则篡改”,大概率是指以下两类混淆场景之一:
-
误将路由前缀配置当作负载均衡规则:例如主应用为子应用分配
/vue3-app路由前缀,子应用通过history.pushState修改路径时意外写入非法路径(如//admin/xxx或跨域路径),被误认为“篡改了负载策略”; -
业务侧自定义了前端路由分发逻辑:比如在主应用中用 JS 实现简易路由映射表(
{ '/order': 'order-subapp', '/pay': 'pay-sdk' }),并允许子应用通过全局变量(如window.__ROUTE_RULE__)动态注册或修改该映射——此时才存在“前端侧规则被篡改”的风险。
真正需要拦截的,是子应用对这类前端可控路由分发状态的非法写入行为。而沙箱中的拦截,应聚焦于“如何让这类写入可审计、可拒绝、可收敛”。
一、明确拦截对象:不是负载均衡器,而是前端路由规则变量
微前端中所谓“负载均衡规则”,通常落地为以下几种前端可读写的载体:
-
全局配置对象:如
window.__ROUTE_MAP__ = { '/user': 'user-service' } -
环境变量挂载点:如
window.APP_ENV === 'prod'影响路由兜底策略 -
生命周期钩子参数:子应用 mount 时传入的
props.activeRule被二次赋值 -
自定义事件广播内容:通过
window.dispatchEvent(new CustomEvent('route:register', { detail: { path: '/xxx', target: 'xxx' } }))动态注册规则
二、用 Proxy + Setter 组合做精细化拦截
单纯靠 Proxy 的 set trap 只能捕获赋值动作,但无法判断“是否非法”。需配合校验逻辑与上下文感知:
- 在
ProxySandbox的sethandler 中,对已知敏感字段(如__ROUTE_MAP__)触发专用校验函数 - 校验逻辑包含:路径合法性(仅允许以
/开头、不含协议和域名)、目标应用白名单(只允许注册已声明的子应用名)、操作权限标识(检查调用栈是否来自主应用 SDK 方法) - 对通过校验的写入,再交由定义在
fakeWindow上的 setter 处理——例如Object.defineProperty(fakeWindow, '__ROUTE_MAP__', { set(val) { console.warn('[RouteGuard] 更新路由映射:', val); notifyMainApp(val); } })
三、禁止绕过式篡改:封堵 eval / Function / with 等逃逸通道
即使加了 Proxy 和 Setter,若子应用使用以下方式,仍可绕过所有 JS 层拦截:
eval('window.__ROUTE_MAP__ = {...}')new Function('return window.__ROUTE_MAP__ = {...}')()with(window) { __ROUTE_MAP__ = {...} }
这些必须由沙箱策略层面禁用,而非依赖属性拦截。qiankun 默认已禁用 eval 和 Function 构造函数;若使用自研沙箱,需在代码解析阶段剥离或报错。
四、推荐替代方案:把规则控制权收归主应用,子应用只提申请
更健壮的做法是放弃“让子应用写规则”,改为:
- 主应用暴露统一注册 API,如
registerRoute({ path: '/order', appName: 'order-subapp', priority: 10 }) - 子应用只能在
bootstrap/mount生命周期内调用该 API,且参数经主应用校验后才写入内部映射表 - 所有运行时路由匹配,均查主应用维护的只读映射表,子应用无权直接修改底层数据结构
这样既避免了拦截逻辑复杂化,又从根本上消除了“非法篡改”发生的可能性。
不复杂但容易忽略:前端没有真正的负载均衡控制权,所谓“拦截篡改”,本质是守住前端可写状态的入口边界。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











