防范第三方库恶意污染 Object.prototype,关键是在执行环境初始化阶段冻结核心原型链、用 Object.create(null) 替代 {} 创建配置容器、拦截高风险脚本、运行时监控原型方法完整性。

防范第三方库恶意污染 Object.prototype,关键不是等它发生后再修复,而是在执行环境初始化阶段就切断污染路径。这类污染往往静默发生、影响全局、排查困难,一旦触发(比如覆盖 toString 或 hasOwnProperty),轻则逻辑错乱,重则全站对象行为异常甚至崩溃。
启动时冻结核心原型链
这是最直接有效的硬性防护手段。在所有第三方脚本加载前,第一时间冻结原生构造函数的 prototype 对象:
- 执行
Object.freeze(Object.prototype)—— 阻止新增、修改、删除任何属性 - 同步冻结
Array.prototype、Function.prototype、Boolean.prototype、String.prototype等常用原型(注意Math不是构造函数,无需 freeze 其 prototype) - 必须放在
<script></script>最顶部或模块入口第一行,确保早于任何第三方库执行 - 严格模式下,尝试污染会抛出
TypeError;非严格模式下静默失败,仍可阻断攻击
用 Object.create(null) 替代 {} 创建配置容器
很多崩溃源于把用户数据或第三方配置合并进普通对象(如 {}),结果污染通过原型链扩散。凡用于存储映射、缓存、参数解析的“字典型”对象,应主动弃用 {}:
- 改用
const map = Object.create(null)—— 它不继承Object.prototype,天然无toString、hasOwnProperty等方法,也就无法被污染 - 注意兼容写法:判断键存在需用
Object.prototype.hasOwnProperty.call(map, key),而非map.hasOwnProperty(key) - 适用场景包括:路由参数解析结果、插件注册表、JSON 配置中间存储、i18n 语言包缓存
拦截并隔离高风险第三方脚本
不是所有第三方库都可信,尤其那些动态加载、未锁定版本或来源不明的脚本:
- 禁止使用
eval、new Function()或内联javascript:执行不可信代码 - 对动态加载的脚本(如 CDN 上的分析 SDK)启用子资源完整性(SRI)校验:
<script src="..." integrity="sha384-..."></script> - 敏感站点可考虑沙箱化:用
<iframe sandbox="allow-scripts"></iframe>加载第三方功能,物理隔离原型环境 - 构建时扫描依赖树,用
npm audit或oss-audit检查是否含已知污染漏洞的旧版 lodash、hoek、merge 等工具库
运行时监控与快速熔断
冻结和隔离是基础,但需配合可观测能力才能及时发现绕过或残留风险:
- 在应用启动后立即注入检测逻辑:
console.log(({}).toString === Object.prototype.toString),若为false则说明已被篡改 - 对关键原型方法(如
Object.prototype.valueOf)做快照比对,定时巡检是否被重写 - 前端错误监控中增加原型污染特征捕获:当
TypeError堆栈含prototype且触发位置在第三方域时,自动标记并告警 - 发现污染后,可触发降级逻辑:清空受影响缓存、重载核心模块、或向用户提示“环境异常,请刷新页面”

















