new.target 不是安全机制,仅提供构造调用上下文信息,无法拦截恶意脚本对核心基类的直接破坏,真正防护需依赖原型冻结、环境隔离、CSP 等分层措施。

new.target 无法拦截恶意脚本对核心基类的直接破坏。
它不是安全机制,而是一个运行时上下文提示工具,仅能反映当前函数是否被 new 调用、以及实际被 new 的是哪个类。它不参与对象创建之后的状态管理,更不干预内存、原型链、类型对象或底层 C 层结构的修改。
以下几点需要明确:
new.target 对基类破坏完全无效
恶意脚本若已具备篡改Array.prototype、劫持Object.setPrototypeOf、污染Function.prototype或通过Reflect.defineProperty强制覆盖内置方法的能力,说明它早已越过 JS 语言层约束——此时new.target的值哪怕正确,也毫无防护意义。-
核心基类破坏通常发生在构造之后
真正危险的操作包括:- 直接修改
String[Symbol.iterator]或Array.prototype.push的实现 - 使用
Object.defineProperty将关键方法设为可写/可配置,再替换为恶意逻辑 - 通过
Proxy包裹全局构造器(如new Proxy(Array, handler))来劫持所有后续实例化行为
这些操作与new.target是否存在、是否匹配无关。
- 直接修改
-
它不能阻止任何跨上下文篡改
new.target是函数执行时的局部元属性,无法:- 阻止
eval或Function构造动态代码注入 - 防御
window.Object = maliciousOverride类型的全局污染 - 干预
WebAssembly.Memory或SharedArrayBuffer级别的底层攻击
- 阻止
真正可行的加固方向是分层防御:
-
冻结关键原型
Object.freeze(Array.prototype); Object.freeze(Object.prototype); Object.seal(Function.prototype);
注意:需在应用加载早期执行,且不能替代沙箱。
使用
Realms或VM2等隔离环境
在可信上下文外运行不可信脚本,从根源切断其对全局基类的访问权限。启用
CSP与trusted types
阻断内联脚本、动态eval和不受控的 HTML 注入,减少恶意代码落地机会。监控与告警
利用Object.getOwnPropertyDescriptors定期快照关键构造器行为,发现异常覆盖立即响应。
new.target 的合理用途是辅助构造语义校验,比如防止类被误作函数调用、识别子类化意图。把它当作“防破坏盾牌”,属于典型的功能误用。










