保障this绑定安全性需:①用object.create(null)创建dmz对象替代全局this;②启用严格模式并显式控制调用;③规避箭头函数词法泄漏;④沙箱化new绑定,冻结原型与返回对象。

在受限环境(如沙箱、插件系统、第三方脚本隔离区)中运行 JavaScript 时,this 的默认绑定可能带来安全隐患——比如意外指向全局对象(window 或 global),进而读写敏感属性或触发原型污染。要保障 this 绑定的安全性,核心思路是:**切断其与危险上下文的隐式关联,强制使用可控、空净的绑定目标**。
用 DMZ 对象替代全局/隐式 this
DMZ(Demilitarized Zone)对象是一个“无委托、无原型链”的纯空对象,可作为安全的 this 占位符,避免任何意外继承或污染。
- 推荐创建方式:
Object.create(null)—— 它不继承Object.prototype,比{}更干净 - 示例:将函数显式绑定到 DMZ 对象,确保执行时 this 不可访问外部环境
function getData() { return this.id || 'default'; }
const safeFn = getData.bind(safeThis);
console.log(safeFn()); // 'default' —— this 完全受控,无法访问 window 或 global
禁用默认绑定:严格模式 + 显式调用控制
默认绑定(独立调用函数)在非严格模式下会把 this 指向全局对象,这是最大风险点之一。
- 所有代码必须启用严格模式:
'use strict',使默认绑定结果为undefined,而非可操作的全局对象 - 禁止裸调用函数;所有函数调用都应通过
.call()、.apply()或.bind()显式传入 this 值 - 对传入的 this 参数做白名单校验(例如只允许
null、undefined或预设 DMZ 对象)
规避箭头函数的词法泄漏风险
箭头函数不绑定自己的 this,而是沿作用域链向上捕获外层 this。若外层上下文不可信(如被恶意 patch 过的模块),箭头函数也会间接“继承”危险上下文。
- 在受限环境中,避免在顶层或不可信闭包内定义箭头函数
- 如需闭包行为,改用普通函数 + 显式
.bind(DMZ),确保 this 来源明确、可控 - 构建工具可配置 ESLint 规则(如
no-arrow-condition扩展)提醒潜在词法泄漏
new 绑定与构造器的沙箱化处理
使用 new 调用构造函数时,this 指向新实例,看似安全,但若构造函数内部访问了 arguments.callee、Function.constructor 或未加防护的原型链,仍可能逃逸。
- 构造函数体开头立即冻结 this 的原型:
Object.setPrototypeOf(this, null)或使用Object.create(null)初始化 - 禁用动态构造:拦截
eval、Function构造器、setTimeout字符串参数等可生成新执行上下文的途径 - 对返回对象做深度冻结(
Object.freeze()递归应用),防止后续篡改











