javascript – 尝试从用户来自对象读取密钥的任何风险?

我们正在编写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他们无能为力.

上一篇:Java优雅编码之Lombok


下一篇:java – 识别有效的getter和setter