首页 > 解决方案 > Object.entries 是否容易受到对象注入攻击?

问题描述

假设我想用散列中的键/值构建一个表(不是我在做什么,但足够相似)。这是一些将作为网页的一部分提供的代码。我写的第一个版本是这样的:

let table = ''; 
Object.keys(foo).forEach(k => 
   // eslint-disable-next-line security/detect-object-injection
   table += `||${k}|${foo[k]}||\n`
);

这触发了 eslint 的对象注入错误(这会产生很多误报,但该对象不是来自客户端输入,因此看起来很安全)。但我想尝试重构以摆脱对象注入问题:

let table = ''; 
Object.entries(foo).forEach(kv =>  table += `||${kv[0]}|${kv[1]}||\n`  );

security/detect-object-injection根据 eslint的说法,这解决了这个问题。但我想确定一下,我在这里找不到任何关于如何解决这个问题的讨论。

在对象注入方面,Object.entries 是否更适合迭代哈希(和值)与 Object.keys?

标签: javascriptsecurityecmascript-6

解决方案


这两种方法是等价的。不同的是,在第二种情况下,简单的静态分析可以确定没有对象注入,因为对象索引中没有使用变量。在第一种情况下,eslint 无法判断这k是一个安全索引,但我们可以轻松判断它,因为Object.keys()它不返回用户输入。

第一个版本中的警告是误报。对象注入仅在密钥来自不受信任的来源时发生,因为它允许他们访问对象的任何属性。但是,如果您在代码中生成属性列表,则它不是注入。误报的发生是因为 eslint 不知道从哪里来kfoo[k]所以它假设最坏的情况。

阅读方括号符号的危险

如果您的意图是处理所有属性,那么当您kObject.keys(). 出于同样的原因,使用 时没有对象注入Object.entries(),因为它获得了相同的键和值。


推荐阅读