JavaScript内置原型防篡改的核心是尽早冻结关键原型,如Object.freeze(Object.prototype)等,防止第三方脚本污染;自定义类原型也应在暴露前冻结,并辅以检测告警机制。

JavaScript 类原型上的方法保护,核心在于防止第三方脚本或意外代码篡改 String.prototype、Array.prototype 等内置原型,避免 .toString()、.push() 等标准方法行为被覆盖导致逻辑错乱。这不是给自定义类加访问控制,而是对运行时环境底层能力的加固。
冻结内置原型是最直接有效的防御手段
使用 Object.freeze() 可以锁定原型对象,使其不可添加、删除、修改属性(包括方法),且原型链指向不可更改:
- 必须在任何第三方脚本执行前尽早调用,推荐放在入口文件最顶部或加载器初始化阶段
- 需逐个冻结关键原型:
Object.freeze(Object.prototype)、Object.freeze(Array.prototype)、Object.freeze(String.prototype)、Object.freeze(Number.prototype)、Object.freeze(Boolean.prototype) - 注意:
Object.freeze()不递归冻结嵌套对象,但对原型对象本身已足够;已遭篡改的原型无法“恢复”,只能预防后续污染
自定义类原型方法的防篡改实践
如果你开发的是供他人使用的 SDK 或基础库,其类的原型方法也应设防:
- 在类定义完成后、暴露给外部前,立即冻结其
prototype:Object.freeze(MyClass.prototype) - 避免在原型上动态挂载方法(如
MyClass.prototype[method] = fn),这类操作在冻结后会静默失败或抛错 - 若需扩展能力,改用组合模式(如通过实例属性注入工具对象)或静态工厂方法,绕过原型修改
补充防护:检测与告警机制
冻结是主动防御,检测是兜底手段。可在开发/测试环境加入原型完整性校验:
立即学习“Java免费学习笔记(深入)”;
- 检查关键方法是否仍为原生函数:
Array.prototype.push.toString().includes('[native code]') - 对比方法引用是否被替换:
Array.prototype.push === Array.prototype.push(利用严格相等判断是否同一函数) - 封装一个轻量校验工具,在启动时运行并上报异常,便于快速定位污染源
不复杂但容易忽略,真正起效的关键就两点:时机要早,范围要全。


















