我们正在编写API(节点模块),我们有以下代码:
function myFunc(dataFromUser){
var dataArr = Object.keys(dataFromUser).map(function(key){
return {name: key, value: dataFromUser[key]};
});
}
用户将直接使用myFunc,这意味着他们将传递他们想要的任何对象.
忽略dataArr的使用方式,无论如何,在评估dataFromUser [key]时,我们容易受到攻击?也许用户可以以一种可能伤害我们的方式实现getter?
解决方法:
让我们假设以下(稍微扩展)函数:
function myFunc(dataFromUser){
// ...
var superSecret = 42;
var dataArr = Object.keys(dataFromUser).map(function(key){
return {name: key, value: dataFromUser[key]};
});
// ...
}
没有getter,没有proxy,您无法在dataFromUser中实现任何内容,以便在评估dataFromUser [key]时访问superSecret变量.
甚至没有尝试使用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)
如果用户有办法伤害你,那就是:
>直接修改源代码;
>或者,因为他们将通过调用require(“your-api”)来使用api,以便能够直接通过api访问他们不应该访问的内容.
但是通过api.myFunc他们无能为力.