首页 > 解决方案 > 使用 Object.keys 在构造函数中初始化值时是否存在对象污染?

问题描述

我有一个定义如下的示例类

class Constants {
  constructor(keysObj) {
    this.keysObj = keysObj
    Object.keys(this.keysObj).forEach((k) => this[k] = keysObj[k])
  }

  function getInformation() {
    console.log("This is default function")
  }
}

因此,当我创建上述类的对象时-我可以访问以下值

    var newConsts = new Constants({
      a: 1,
      b: 2,
      c: 3
    })

    // so I can access above values in this way

    console.log(newConsts.c) // outputs 3
    console.log(newConsts.getInformation) // outputs  "This is default function"

代码是否容易受到对象污染?

到目前为止我观察到的是 - 如果我创建一个像这样的新对象

var newConsts1 = new Constants({
  a: 1,
  b: 2,
  getInformation: function() {
    console.log('This is modifed')
  }
})

// so I can access above values in this way

console.log(newConsts1.b) // outputs 2
console.log(newConsts1.getInformation) // outputs  "This is modifed"

对象污染可以在这个类上进行吗?如果是这样,请让我知道污染它的不同方法是什么。

这会对代码有任何影响吗

var newConsts3 = new Constants({
  a: 1,
  b: 2,
  __Proto__: {
    toString: function() {
      console.log('faulty toString Executed')
    }
  }
})

var newConsts3 = new Constants({
  a: 1,
  b: 2,
  prototype: {
    construtor: undefined
  }
}
})

标签: javascriptnode.js

解决方案


简短的回答是YES。这是因为您没有在安全模式下检查您的密钥是否"initializing"正确,因此,您可以向您的对象发送任何内容并使其易受攻击。


推荐阅读