javascript - 在 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 规范或参考文档,则可以加分。
解决方案
上的所有属性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__);
推荐阅读
- matlab - 可以提高 Matlab export_fig 中点的分辨率吗?
- python - Yelp 抓取,Python 难以获得汽车旅馆
- android - App Bar 不会根据导航组件中的 Fragment 更改
- r - 如何通过多个数据帧循环功能
- mysql - 涉及 COUNT() 和 LOWER() 的 Spring JPA 查询
- python - Openpyxl - 给单元格一个标识符
- python - 当值更改时,如何使我的 Kivy 标签动态更新?
- django - yoyo 迁移和 django 迁移有什么区别?
- java - 使用字符检查二维数组中的某些单词(作业)
- xml - 为什么在我的 XSL 文件中包含键会产生加载错误?