我是JS api的测试员。用户将直接调用我们的方法。
例:
function funcWeGiveToUser(objFromUsers){
// here we will loop over user provided object
}
开发人员以这样的方式编写funcWeGiveToUser
,我们盲目地循环objFromUsers
,所以我试图通过盲目地使用该对象来证明没有验证会发生坏事。
现在我想看看,如果通过提供包含getter的objFromUsers
,我可以以某种方式破坏代码(我已经通过这个访问私有数据了,是的!)。
我想要的是让对象永远改变,这样当我们的API循环它时,它将是多余的 - 但我无法实现这一点。
我试着写这样一个对象:
var objFromUsers = {
get addNewOne(){
this.counter = this.counter || 1;
this["element"+ (this.counter++)] = "some value";
return 2;
}
}
但如果我自己循环,这就是结果:
for (el in objFromUsers) console.log(el+": "+objFromUsers[el]);
// addNewOne: 2
console.log(objFromUsers)
// {counter: 2, element1: "some value"}
再次循环我确实得到了以前添加的元素:
for (el in objFromUsers) console.log(el+": "+objFromUsers[el]);
// addNewOne: 2
// counter: 3
// element1: some value
console.log(objFromUsers)
// {counter: 3, element1: "some value", element2: "some value"}
但是,我实际上希望循环将永远看到一个新的密钥,因此它将继续迭代。是否有可能实现这种循环冗余?
for..in
如何通过不受信任的输入失败的一个例子是一个Proxy对象,它在ownKeys
陷阱中做了一些令人讨厌的事情:
evil = new Proxy({}, {
ownKeys() {
console.log('got ya');
return [];
}
});
for(x in evil) {
console.log(x)
}