尝试从用户来自对象读取密钥有任何风险吗?

时间:2018-03-22 13:23:17

标签: javascript getter

我们正在编写API(节点模块),我们有以下代码:

function myFunc(dataFromUser){
    var dataArr = Object.keys(dataFromUser).map(function(key){
        return {name: key, value: dataFromUser[key]};
    });
}

用户将直接使用myFunc,这意味着他们将传递他们想要的任何对象。

忽略dataArr的使用方式,无论如何,在评估点dataFromUser[key]时我们是否容易受到攻击?也许用户可以以一种可能伤害我们的方式实现getter

1 个答案:

答案 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)

如果有一种方法可以伤害用户,那就是:

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

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