js原型链污染学习
早有耳闻,一直没来看js这方面的内容,现在终于把它学了一下
prototype、__proto__和constructor
举例帮助理解
通过函数test创建对象test1
function test(){ this.a = "1"; } test1 = new Test();
在js中,所有的对象都是从基础对象继承下来的,所以每个对象都有其原型对象
构造函数的prototype即为其原型对象
在实例化出来的对象中可以通过__proto__来得到其构造函数的原型对象,即
test.prototype=test1.__proto_
类似的,对象的constructor指向它的构造函数,即
test1.constructor == test()
如果对象是自变量定义的话其constructor为function Object()
prototype为函数独有,所有对象都有__proto__和constructor,同时函数本身也是对象
原型链的原理
有点python里ssti那味儿
原型链污染
攻击者控制一个对象的原型,就可以通过其影响和其来自同类、同父祖类的对象
接上面的例子,此时输出test1.a为1,test1.b为undefined(这里寻址也可以用test1['a'])
令其原型对象的b为2
test.prototype.b="2"
此时输出test1.b为2
同理,定义
test.__proto__.c="3"
此时输出test1.c为3
顺着链子往上进行修改,也可以通过其影响到自变量定义出来的对象,如
test.__proto__.__proto__.d=4
let obj = {}
此时obj.d为4
原理理解了😬后面再做几道题巩固一下吧