Object.freeze()冻结原型仅限第一层,需配合锁定prototype属性、显式定义关键方法属性及冻结全局原生原型等措施才能彻底防篡改。

直接用 Object.freeze() 冻结原型对象是最基础也最有效的防篡改手段,但必须配合其他操作才能真正锁死关键方法——它本身只管“第一层”,不拦替换、不防嵌套、也不隐藏敏感入口。
冻结原型对象本身
对构造函数的 prototype 调用 Object.freeze() 后,所有已有属性自动变为 writable: false 和 configurable: false:
- 不能覆盖方法体(
MyClass.prototype.method = newFn失效) - 不能删除该方法(
delete MyClass.prototype.method静默失败) - 不能重定义其属性描述符(
Object.defineProperty会报错)
必须在类定义完成、任何实例创建前执行:
class MyClass { /* ... */ }
Object.freeze(MyClass.prototype);
锁定构造函数的 prototype 属性
仅冻结原型对象还不够——攻击者仍可能直接替换整个原型:MyClass.prototype = {}。需进一步锁死构造函数的 prototype 属性:
立即学习“Java免费学习笔记(深入)”;
通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。
Object.defineProperty(MyClass, 'prototype', {
configurable: false
});
这样连原型引用本身都不可变更,从根源上杜绝“换皮”式篡改。
对关键方法做精细控制
对特别敏感的方法(如 save、validate),不依赖默认赋值,而用 Object.defineProperty 显式声明:
-
writable: false→ 阻止方法被重赋值 -
configurable: false→ 阻止被删除或重定义 -
enumerable: false→ 不出现在for...in或Object.keys()中,降低暴露面
Object.defineProperty(MyClass.prototype, 'save', {
value: function() { /* 核心逻辑 */ },
writable: false,
configurable: false,
enumerable: false
});
注意原型链污染的全局风险
如果涉及全局原生原型(如 Object.prototype、Array.prototype),必须在所有脚本执行前第一时间冻结:
- 在页面第一个
<script>的顶部立即执行Object.freeze(Object.prototype) - 顺带冻结
Array.prototype、Function.prototype、String.prototype等关键原型 - 业务中避免使用普通字面量
{},改用Object.create(null)创建无原型对象
这类对象没有 __proto__,不会继承被污染的原型方法,也天然规避了键名如 "__proto__" 的注入风险。

















