尝试从用户提供的对象中读取密钥有任何风险吗?

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)

如果用户有可能伤害你的方式,那就是:

  1. 直接修改源码;
  2. 或者,因为他们将通过调用 require("your-api") 来使用 api,以访问他们不应该直接通过 api 访问的内容。

但是通过 api.myFunc 他们无能为力。