我们正在编写API(节点模块),我们有以下代码:
function myFunc(dataFromUser){
var dataArr = Object.keys(dataFromUser).map(function(key){
return {name: key, value: dataFromUser[key]};
});
}
用户将直接使用myFunc
,这意味着他们将传递他们想要的任何对象。
忽略dataArr
的使用方式,无论如何,在评估点dataFromUser[key]
时我们是否容易受到攻击?也许用户可以以一种可能伤害我们的方式实现getter?
答案 0 :(得分:0)
让我们想象一下以下功能(略有扩展):
function myFunc(dataFromUser){
// ...
var superSecret = 42;
var dataArr = Object.keys(dataFromUser).map(function(key){
return {name: key, value: dataFromUser[key]};
});
// ...
}
没有getter,没有proxy,在评估dataFromUser
时,您无法在superSecret
中实现以访问dataFromUser[key]
变量的任何内容。
甚至不尝试使用this
关键字,因为它指向dataFromUser
obj,而不是myFunc
function myFunc(dataFromUser){
var dataArr = Object.keys(dataFromUser).map(function(key){
return {name: key, value: dataFromUser[key]};
});
console.log(dataArr);
}
let obj = {stuff:"random"};
Object.defineProperty(obj,"msg",{
get() {
return this; // refers to obj, and not myFunc, even if it is
// actually called and evaluated in myFunc
},
enumerable: true
});
myFunc(obj)
如果有一种方法可以伤害用户,那就是:
api
来使用require("your-api")
,所以他们不应该直接通过api
来访问某些东西。但是通过api.myFunc
,他们无能为力。