冻结原型链顶层的核心动作是提前对原生构造函数的prototype对象调用object.freeze(),以阻止原型污染攻击;需冻结object、array、function、string、boolean、date等原型,且必须在任何第三方代码执行前内联完成。

在 JavaScript 中实现 API 防篡改,冻结原型链顶层的核心动作是:对原生构造函数的 prototype 对象调用 Object.freeze(),且必须在任何第三方代码执行前完成。
为什么要冻结原型链顶层
原型链污染攻击常通过修改 Object.prototype、Array.prototype 等顶层原型,让所有对象实例“意外继承”恶意属性或方法。比如:
-
Object.prototype.__proto__ = {...}可能被用于篡改整个原型链走向 -
Array.prototype.map = maliciousFn会让所有数组调用 map 时执行恶意逻辑 - 一旦污染发生,影响范围是全局、隐式、难以排查的
冻结这些原型后,新增、删除、重写属性的操作都会失效(严格模式报错,非严格模式静默失败),从源头切断污染路径。
需要冻结的关键原型对象
以下原型必须全部冻结,缺一不可:
Object.freeze(Object.prototype)Object.freeze(Array.prototype)Object.freeze(Function.prototype)Object.freeze(String.prototype)Object.freeze(Boolean.prototype)Object.freeze(Date.prototype)
注意:Math 不是构造函数,没有 prototype,但可选冻结其自身(Object.freeze(Math));Number.prototype 和 RegExp.prototype 也建议冻结,增强防御纵深。
冻结时机与位置要求
冻结操作必须早于任何外部脚本——包括框架、SDK、埋点、广告代码等:
- 放在 HTML 中第一个
<script></script>标签的最顶部 - 不能写在模块中、不能依赖打包工具注入顺序
- 推荐直接内联,避免加载延迟或执行时机偏差
示例写法:
`<script>Object.freeze(Object.prototype); Object.freeze(Array.prototype); /* ...其余同理 */</script>`冻结只是基础,还需配合业务层防护
仅靠冻结原型不够,实际工程中需同步落地以下措施:
- 配置对象不用
{},改用Object.create(null)—— 彻底脱离原型链,天然免疫 - 解析外部数据(如 JSON、URL 参数、API 响应)后,不直接
Object.assign(target, input),先过滤掉__proto__、constructor、prototype等敏感键名 - 关键常量对象用
Object.freeze()浅冻结(如const CONFIG = Object.freeze({ API_URL: '...' });),但注意嵌套对象需手动深冻或结构扁平化
冻结原型链顶层不是“一劳永逸”,而是构建可信执行环境的第一道硬边界。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











