不可删除的核心沙箱变量需通过Object.defineProperty设置configurable: false实现,同时配置writable: false和enumerable: false以确保不可删、不可改、不可遍历,适用于微前端沙箱等安全隔离场景。

直接在 window 上用 Object.defineProperty 注入不可删除的变量是可行的,但需特别注意浏览器安全策略、沙箱环境限制以及属性描述符的精确配置。核心在于设置 configurable: false(禁止删除和重定义),同时合理选择 writable 和 enumerable 以满足“核心沙箱变量”的语义——即稳定、不可篡改、不暴露于遍历。
明确目标:什么是“不可删除的核心沙箱变量”
这类变量通常用于微前端沙箱(如 qiankun)、插件系统或安全隔离场景,要求:
- 不能被
delete window.xxx删除 - 不能被后续
Object.defineProperty或Object.defineProperties覆盖(configurable: false是关键) - 值应受控(建议设
writable: false防止意外修改) - 通常不希望出现在
for...in或Object.keys(window)中(设enumerable: false)
正确写法:使用 Object.defineProperty 配置不可删除属性
以下代码可在主应用或沙箱初始化阶段执行:
Object.defineProperty(window, '__SANDBOX_CORE__', {
value: { version: '1.0.0', env: 'prod' },
writable: false,
enumerable: false,
configurable: false // ⚠️ 这是禁止 delete 的核心开关
});
验证是否生效:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
console.log(window.__SANDBOX_CORE__); // { version: '1.0.0', env: 'prod' }
delete window.__SANDBOX_CORE__; // 返回 false(严格模式下静默失败,非严格模式也无效)
console.log(window.__SANDBOX_CORE__); // 依然存在
注意事项与常见陷阱
浏览器对 window 的属性有特殊处理,尤其在 iframe 或跨域沙箱中:
-
iframe 沙箱限制:若页面启用了
sandbox="..."属性(如sandbox="allow-scripts"),部分属性可能无法定义或被忽略,需确保沙箱未禁用 DOM 修改能力 -
全局属性覆盖风险:避免覆盖已有原生属性(如
window.location),否则可能引发异常或破坏浏览器行为 -
Strict Mode 影响:在严格模式下,尝试删除不可配置属性会抛出
TypeError;非严格模式仅返回false,需主动检查返回值 -
Symbol 属性更安全?:若需更高隐蔽性,可考虑用
Symbol键(如Symbol('core')),但注意它无法通过字符串访问,不适合通用注入场景
进阶:批量注入 + 兼容性兜底
为提升健壮性,可封装一个安全注入函数:
function defineSandboxGlobal(key, value) {
if (Object.prototype.hasOwnProperty.call(window, key)) {
const desc = Object.getOwnPropertyDescriptor(window, key);
if (desc && desc.configurable === false) return; // 已存在且不可配置,跳过
}
Object.defineProperty(window, key, {
value,
writable: false,
enumerable: false,
configurable: false
});
}
// 使用
defineSandboxGlobal('__QIANKUN_INSTANCE__', { app: 'main-app' });
该函数避免重复定义,并跳过已存在的不可配置属性,防止报错。
不复杂但容易忽略细节。关键是 configurable: false 必须显式设置,且一旦生效就无法撤销——设计时就要想清楚生命周期和必要性。

















