如何通过 object.getownpropertydescriptor 监控并防御由于 object.prototype 污染引起的风险

Object.getOwnPropertyDescriptor 本身不能直接监控或防御 Object.prototype 污染,但它可作为检测手段配合防护策略使用。关键在于:它能帮你识别“意外出现在实例上的属性是否来自原型链污染”,而非拦截污染行为本身。

识别被污染的原型属性

当恶意代码向 Object.prototype 添加属性(如 Object.prototype.admin = true),所有普通对象都会继承该属性。但该属性在实例上并不存在,只是可枚举、可访问——此时 Object.getOwnPropertyDescriptor(obj, ‘admin’) 会返回 undefined,而 ‘admin’ in obj 为 true,obj.admin 也能读取到值。

这种“存在但无描述符”的现象就是原型污染的典型信号:

若 key in obj === true 且 Object.getOwnPropertyDescriptor(obj, key) === undefined,说明该属性很可能来自 Object.prototype 进一步验证:Object.getPrototypeOf(obj) === Object.prototype 且 Object.getOwnPropertyDescriptor(Object.prototype, key) !== undefined

在关键操作前做安全检查

对用户输入、JSON 解析结果、第三方数据等敏感对象,在遍历或赋值前可封装校验逻辑:

例如防止污染导致的意外覆盖:

function safeAssign(target, source) { for (const key of Object.keys(source)) { // 拒绝从原型链继承来的 key(即非自有属性) if (!Object.prototype.hasOwnProperty.call(source, key)) continue; // 确保 target 上该 key 是自有属性才赋值(防污染键名覆盖自身逻辑) if (Object.getOwnPropertyDescriptor(target, key) == null) { Object.defineProperty(target, key, { value: source[key], writable: true, enumerable: true, configurable: true }); } else { target[key] = source[key]; } } return target;}

结合 Object.getOwnPropertyDescriptors 做深度快照比对

在应用启动或关键模块加载后,可预先记录 Object.prototype 的原始自有属性描述符:

const originalProtoDescs = Object.getOwnPropertyDescriptors(Object.prototype);

后续运行中,定期执行检查:

获取当前 Object.prototype 所有自有属性名:Object.getOwnPropertyNames(Object.prototype) 对每个新增属性(不在 originalProtoDescs 中的),用 Object.getOwnPropertyDescriptor(Object.prototype, key) 查看其配置 若发现 configurable: true 且 value 非标准方法(如不是 toString、hasOwnProperty),就触发告警或冻结

必要时可立即冻结:Object.freeze(Object.prototype)(注意:需在早期执行,否则已有污染无法清除)

防御性编码习惯建议

仅靠 getOwnPropertyDescriptor 不够,必须组合实践:

永远用 Object.prototype.hasOwnProperty.call(obj, key) 替代 obj.hasOwnProperty(key),避免被重写覆盖 解析 JSON 后,对结果对象调用 Object.setPrototypeOf(obj, null) 或使用 Object.create(null) 创建纯净字典对象 使用 for…in 时务必配合 hasOwnProperty 过滤;优先选用 Object.keys() 或 Object.getOwnPropertyNames() 在沙箱环境或微前端中,可通过 Realm 或 iframe 隔离原型空间(现代浏览器支持)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。