尝试从用户提供的对象中读取密钥有任何风险吗?
Any risk in attempting to read a key from an object that comes from the user?
我们正在编写一个 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, no 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
他们无能为力。
我们正在编写一个 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, no 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
他们无能为力。