是对象.入口容易受到对象注入攻击的影响



假设我想从哈希(Hash(中的密钥/值构建一个表(不是我在做的事情,而是足够相似(。这是一些代码,可以作为网页的一部分提供。我写的第一个版本就像:

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`  );

根据ESLINT摆脱了security/detect-object-injection问题。但是我想确保,我找不到有关如何在此处解决这个问题的任何讨论。

对象是对迭代(和值(与object.keys的迭代更好的入口吗?

这两种方法是等效的。区别在于,在第二种情况下,简单的静态分析可以确定没有对象注入,因为对象索引中没有使用变量。在第一种情况下,ESLINT无法确定k是一个安全的索引,但是我们可以很容易地说出来,因为Object.keys()不返回用户输入。

第一个版本中的警告是误报。仅当键来自未经信任的源时,就会发生对象注入,因为它允许它们访问对象的任何属性。但是,如果您要生成代码中的属性列表,那不是注射。由于ESLINT不知道kfoo[k]中的位置,因此发生了误报。

阅读方括号符号的危险

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

最新更新