Object.getPrototypeOf是最可靠的原型污染探测手段,用于初始化校验、快照比对和运行时守卫:启动时扫描原生原型异常属性,实例化后记录并比对原型基线,配合Proxy拦截非法setPrototypeOf操作,并可冻结高危原型链实现底层防护。

Object.getPrototypeOf 本身不提供“屏蔽”能力,但它是最可靠的探测手段——能准确识别原型是否被非法扩展,从而触发后续防御动作。关键在于把它嵌入初始化校验、快照比对和运行时守卫三个环节。
一、在应用启动时快速扫描原生原型污染
恶意插件常在全局脚本加载早期向 Object.prototype、Array.prototype 或 Function.prototype 注入方法(如 toJSONString、__hook__)。可在主逻辑执行前立即检查:
- 遍历敏感原型对象:
Object.getOwnPropertyNames(Object.prototype)、Array.prototype等 - 过滤出非标准属性:排除已知规范属性(如
toString、push)和浏览器自有扩展(如@@iterator) - 对每个可疑属性,用
Object.getPrototypeOf验证其归属:const desc = Object.getOwnPropertyDescriptor(Array.prototype, 'maliciousMethod');<br>if (desc && desc.value && Object.getPrototypeOf(desc.value) === Function.prototype) { /* 可能是注入的函数 */ }
二、为关键实例建立原型链基线并实时比对
插件可能不直接污染全局原型,而是劫持单个实例的 [[Prototype]]。此时需对敏感类实例做“出厂快照”:
- 在创建
new Request()、new Response()、new Map()后,立刻记录:const baseProto = Object.getPrototypeOf(instance); - 将
baseProto存入实例私有字段(如instance[Symbol.for('safeProto')])或 WeakMap 缓存 - 在调用关键方法前校验:
if (Object.getPrototypeOf(instance) !== instance[Symbol.for('safeProto')]) {<br> console.warn('Prototype hijacked on', instance.constructor.name);<br> throw new SecurityError('Prototype tampered');
三、配合 Proxy 拦截并阻断原型篡改行为
仅检测不够,需主动拦截篡改入口。用 Proxy 包裹原生构造函数返回的对象,重点捕获 setPrototypeOf 和 getPrototypeOf:
- 定义 handler:
const handler = {<br> setPrototypeOf(target, proto) {<br> if (proto !== target[Symbol.for('safeProto')]) {<br> console.error('Blocked illegal prototype assignment');<br> return false;<br> }<br> return Reflect.setPrototypeOf(target, proto);<br> }<br>}; - 对高风险对象(如 fetch 返回的 Response)自动代理:
const safeResponse = new Proxy(originalResponse, handler); - 注意:Proxy 无法代理原生对象内部行为,但可覆盖用户层调用路径,有效阻断多数插件注入逻辑
四、冻结关键原型链实现底层防护
对确认无扩展需求的原型对象,直接冻结其可写性与可配置性:
- 冻结整个原型对象:
Object.freeze(Object.prototype);(慎用,可能影响兼容性) - 更安全做法:冻结具体污染高发点,例如:
Object.freeze(Array.prototype);<br>Object.freeze(Function.prototype);
- 冻结后,任何尝试设置
obj.__proto__或调用Object.setPrototypeOf()都会在严格模式下抛出TypeError
这套组合策略不依赖黑名单,也不需要预判插件行为,而是从原型链真实状态出发,把探测、基线、拦截、冻结四个动作串成闭环。实际部署时,建议优先启用快照比对 + Proxy 拦截,再按需开启冻结,平衡安全性与兼容性。

















