object.getprototypeof 本身不防御原型污染,仅用于读取对象原型;真正防护需结合原型链检查、object.freeze、proxy拦截及安全对象创建策略,并用它实时观测原型状态。

Object.getPrototypeOf 本身不用于防御原型污染,而是用于读取对象的原型。真正起防御作用的是配合它进行的原型链检查和只读限制。关键在于:不要直接修改 Object.prototype 或 Array.prototype,而要用 Object.getPrototypeOf 判断目标对象是否可能被污染,并拦截对原型的非法写入。
识别污染风险对象
在沙箱中执行第三方脚本前,应检查其操作的对象是否指向全局原型:
- 用 Object.getPrototypeOf(obj) 获取对象原型,若返回 Object.prototype、Array.prototype 或 Function.prototype,说明该对象原型链直达全局,写入 __proto__ 或 constructor.prototype 可能引发污染
- 对 JSON.parse() 返回的对象、{}、[] 等字面量创建的对象,需特别检查其原型是否已被篡改(例如 Object.getPrototypeOf({}) !== Object.prototype)
- 可建立白名单机制:仅允许原型为特定“洁净”构造器(如 sandbox.Object)的对象参与敏感操作
配合 Object.freeze 和代理拦截
仅靠 Object.getPrototypeOf 无法阻止污染,必须结合防护手段:
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
- 在沙箱初始化时,对 Object.prototype、Array.prototype 等关键原型调用 Object.freeze(),阻止新增/修改属性(注意:IE 不支持,需降级处理)
- 用 Proxy 包裹全局对象(如 globalThis),在 set 拦截器中检测 key 是否为 __proto__、constructor,并检查 value 是否为原型对象;若检测到试图赋值 prototype 或设置 __proto__ 指向危险原型,直接拒绝
- 当拦截到 obj[key] = val 时,可用 Object.getPrototypeOf(val) 判断 val 是否为内置原型——若是,视为高危操作
沙箱内统一对象创建策略
避免依赖默认原型,从源头降低风险:
- 重写 Object.create(null),确保新建对象无原型继承(即 Object.getPrototypeOf(Object.create(null)) === null)
- 将 JSON.parse 替换为安全版本:解析后递归遍历所有对象,对其调用 Object.setPrototypeOf(obj, null) 或 Object.freeze(obj),再用 Object.getPrototypeOf 验证结果
- 对 eval、Function 构造器生成的对象,强制重置原型:Object.setPrototypeOf(fn, sandbox.Function.prototype)
运行时污染检测与告警
在关键节点主动探测是否已被污染:
- 定期执行检查:Object.getPrototypeOf({}) === Object.prototype && Object.getPrototypeOf([]) === Array.prototype && !Object.prototype.polluted —— 若任一不成立,触发告警或重启沙箱
- 为 Object.prototype 添加不可枚举标记属性(如 Object.defineProperty(Object.prototype, '__safe_sandbox__', {value: true, enumerable: false})),之后用 Object.getPrototypeOf(obj) 获取原型后检查是否存在该标记,缺失即提示潜在污染
- 对沙箱内所有对象的原型链做快照(记录 Object.getPrototypeOf 链),diff 对比变化,定位污染源头
不复杂但容易忽略:Object.getPrototypeOf 是观察窗口,不是防护盾。真正的防御在于冻结 + 代理 + 创建约束三位一体,而它的价值在于让这些策略“看得见”原型链状态。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










