原型链污染是攻击者通过可控输入向object.prototype注入属性导致的漏洞,危害包括权限校验失效、白名单逻辑绕过等;应冻结原生原型、避免危险操作、使用null原型对象、加固开发习惯并加强监控。

原型链污染不是代码写错,而是执行环境被悄悄改写——攻击者通过可控输入向 Object.prototype 注入属性,导致所有对象意外继承恶意行为。危害往往隐蔽且连锁:一个被污染的 toString 可能让权限校验失效,一个被覆盖的 hasOwnProperty 会让白名单逻辑形同虚设,甚至为后续命令执行铺路。
堵住污染入口:冻结原生原型
这是最直接有效的硬防护措施,应在应用加载最早期、任何第三方脚本执行前完成:
- 调用
Object.freeze(Object.prototype),同时建议一并冻结其他关键原型:Array.prototype、Function.prototype、String.prototype、Boolean.prototype、Date.prototype - 必须放在 HTML 第一个
<script></script>的顶部,或 Node.js 入口文件最开始位置 - 配合
'use strict';使用,确保污染尝试会立即抛出TypeError,而非静默失败
避免危险操作:不信任任何外部输入
绝大多数污染都源于把用户数据当“路径”或“结构”来处理:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 禁止直接
JSON.parse()后合并进配置对象,尤其当 JSON 可能含{"__proto__": {"admin": true}} - 禁用存在风险的深拷贝/合并函数(如旧版
lodash.merge),升级到修复版本(lodash ≥ 4.17.21),或改用structuredClone()(现代浏览器/Node.js 17.0+) - 手动递归赋值时,显式过滤敏感键名:
__proto__、constructor、prototype及其大小写变体(如__PROTO__)
构建免疫对象:用 null 原型替代普通对象
业务层主动规避,比事后拦截更可靠:
- 配置对象、解析结果容器、中间数据结构,优先使用
Object.create(null)创建,它没有原型链,天然不继承Object.prototype上的任何属性 - 避免
{}字面量作为默认目标,改用Object.assign(Object.create(null), input)做浅合并 - 在 Node.js 服务中,可启用
--disable-proto=throw启动参数,强制拦截对__proto__的赋值
加固开发习惯:隔离与监控
防御是组合拳,单点防护总有盲区:
- 不直接扩展原生原型(如
Array.prototype.last),改用工具函数:const last = arr => arr?.[arr.length - 1]; - 若需增强能力,用子类继承(
class MyArray extends Array),新方法只作用于自定义实例 - 在 CI/CD 流程中加入扫描规则,自动检测代码中出现的
.prototype.赋值操作 - 对关键服务增加运行时监控,例如用
Proxy包裹全局对象,记录非常规属性写入
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










