函数与普通对象间Prototype pollution的不对称性及反向污染可行性
函数与普通对象的原型污染不对称性分析
函数与"普通"1对象之间的原型污染存在明显不对称性,示例代码如下:
var a = {} function foo(){} a.__proto__.something = 32; foo.__proto__.bar = 67; console.log(a.bar) // <--- 未被污染 console.log(foo.something) // <--- 已被污染
现象解释
a.__proto__指向Object.prototype,给它添加something属性后,所有继承自Object.prototype的对象都会共享该属性。由于Function.prototype本身是Object的实例(原型链指向Object.prototype),因此函数foo能访问到something。foo.__proto__指向Function.prototype,给它添加bar属性后,只有函数类型的对象会继承该属性。普通对象的原型链仅延伸至Object.prototype,不会触及Function.prototype,因此a无法访问bar。
问题解答:函数能否污染普通对象?
不能直接通过修改函数的__proto__来污染普通对象。原因如下:
- 普通对象的原型链为
普通对象 → Object.prototype → null,不包含Function.prototype; - 修改
Function.prototype的属性只会影响所有函数,普通对象无法获取这些属性。
如果通过foo.__proto__.__proto__(即Object.prototype)添加属性,本质上还是修改了Object.prototype,这和直接修改普通对象的__proto__效果一致,但不属于“函数污染普通对象”的特有场景。
1 关于“普通对象”的术语目前尚未达成共识
内容的提问来源于Stack Exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

