首页 > 解决方案 > 在 JavaScript 对象(例如“__proto__”)上分配哪些键是不安全的?

问题描述

我想使用 JavaScript 对象 ( {}) 作为字典来存储不受信任的数据。(我知道有Map,但假设我不想使用Map。)

如果我写

let obj = {};
obj[key] = value;

在哪里key并且value由不受信任的来源提供,哪些密钥会导致令人惊讶的行为?

我知道分配obj.__proto__可以改变对象的原型,从而改变对象的行为。(这有时被称为原型中毒。)所以我可能应该排除'__proto__'

let obj = {};
if (key !== '__proto__') {
  obj[key] = value;
}

是否还有其他这样的不安全键可以以某种方式改变对象的行为,或者是'__proto__'唯一的?

如果您引用 ECMAScript 规范或参考文档,则可以加分。

标签: javascriptsecurity

解决方案


上的所有属性Object.prototype都可能导致有问题的名称冲突:

console.log(
  Object.getOwnPropertyNames(Object.prototype)
);

而已。

避免担心名称冲突的另一个选择是创建一个继承自的对象Object.prototype,例如:

const obj = Object.create(null);

// Now, this is perfectly fine (though weird):
obj.__proto__ = 'foo';
console.log(obj.__proto__);


推荐阅读