快速定位object.prototype污染需三步:先用getownpropertynames过滤非原生属性查异常键;再通过defineproperty拦截setter捕获非法写入;最后新建对象验证属性是否实际生效并回溯json解析、表单赋值等高危环节。

排查原型链属性修改导致的全局污染,关键在于快速定位谁改了 Object.prototype,以及哪些对象因此行为异常。这不是靠猜,而是有明确路径可循。
检查 Object.prototype 是否被意外添加属性
直接在控制台或调试阶段运行以下代码,能立刻发现污染痕迹:
-
列出所有非原生属性:
Object.getOwnPropertyNames(Object.prototype).filter(key => !({toString:1, valueOf:1, constructor:1})[key])—— 若返回非空数组(比如出现isAdmin、__exp等非常规键),说明已被写入 - 对比干净环境:在新标签页打开空白 HTML,执行相同命令,记下基线结果,再回到问题页面比对差异
监控敏感属性写入操作
在开发或测试环境注入实时拦截逻辑,捕获非法修改行为:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Object.defineProperty临时重写Object.prototype.__proto__或constructor.prototype的 setter,抛出错误并打印调用栈 - 对已知高危函数(如
lodash.merge、_.set、自定义 deepAssign)打补丁,在入口处加断点或日志,检查输入 source 是否含__proto__、constructor、prototype及其大小写变体(如__PROTO__)
验证污染是否实际生效
仅看原型上有无属性不够,要确认它是否影响实例行为:
- 新建一个空对象
const test = {},然后访问疑似被污染的属性,例如test.isAdmin或test.toString === 'xxx' - 若返回非
undefined或非预期值,且该属性未在test自身定义,就证实污染已生效 - 进一步检查多个不同来源的对象(
{}、new Date()、JSON.parse('{}'))是否都表现出相同异常,确认污染范围
回溯污染源头的常见位置
多数污染发生在数据落地环节,重点排查这些位置:
- 后端返回 JSON 被
JSON.parse()后直接传给合并函数(如merge(config, userJson)),而 JSON 字符串含{"__proto__": {"x": 1}} - URL 查询参数或表单字段被拼成对象,再递归赋值到全局配置对象,未过滤键名
- 使用旧版工具库(如 lodash merge 默认允许遍历并写入
__proto__
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










