检测原型方法污染需确认父类prototype是否被非法添加/覆盖方法并被子类继承执行:检查object.getownpropertynames结果对比基线,筛查原生方法重写及非常规钩子;验证子类实例调用可疑方法是否成功且非预期;监控prototype动态修改并锁定关键属性;排查setprototypeof、for...in遍历等高危继承模式。

检测类继承中的原型方法污染风险,核心是确认是否有人向父类(尤其是 Object 或自定义基类)的 prototype 上非法添加或覆盖了方法,导致所有子类实例行为异常。这不是看“有没有改”,而是看“改了之后是否被意外继承并执行”。
检查基类 prototype 是否存在非预期方法
直接检查构造函数的 prototype 对象上是否有可疑属性,尤其关注那些未由你主动定义、却出现在所有实例上的方法:
- 运行
Object.getOwnPropertyNames(ParentClass.prototype),对比项目初始化时的基线(如新标签页中执行同一命令),识别新增项 - 重点筛查:
__proto__、constructor、toString、valueOf等原生方法名是否被重写;也留意明显非常规名,如isAdmin、exec、run等可能被注入的逻辑钩子 - 对自定义基类(如
BaseModel)同样执行该检查,避免只盯Object而忽略中间层污染
验证子类实例是否继承了污染方法
仅看原型上有无属性不够,要确认它是否实际影响实例调用行为:
- 新建一个干净实例:
const inst = new ChildClass(),然后执行inst.suspiciousMethod()或访问inst.suspiciousProp - 若调用成功且返回非预期结果(如抛出错误、返回固定字符串、触发远程请求等),而该方法并未在
ChildClass或其直接父类中定义,就说明污染已穿透继承链 - 进一步比对:
inst.hasOwnProperty('suspiciousMethod')应为false,但typeof inst.suspiciousMethod === 'function'为true,这是典型污染信号
监控构造函数 prototype 的动态修改
在开发环境注入轻量级防护,捕获对 prototype 的非法写入:
- 对关键类(如
Object、Array、BaseModel)的prototype使用Object.defineProperty锁定关键属性的writable和configurable为false - 或临时劫持 setter:例如重写
ParentClass.prototype.__defineSetter__('dangerousMethod', ...),在设值时抛错并打印堆栈 - 特别注意第三方库初始化阶段(如 moment、lodash、某些 UI 组件库),它们常在加载时向原型挂载工具方法,需审查其源码或文档是否声明了此类行为
回溯高危继承使用场景
污染常在“扩展继承能力”的过程中引入,重点排查以下代码模式:
- 使用
Object.setPrototypeOf(Child.prototype, Parent.prototype)手动设置原型链,且未校验Parent.prototype是否已被篡改 - 通过
for...in遍历父类prototype并批量复制方法到子类(未用hasOwnProperty过滤),导致把污染方法一并继承 - 在类定义中使用
Reflect.ownKeys(Parent.prototype)或getOwnPropertyDescriptors做方法代理/装饰,但未排除__proto__等特殊键
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











