javascript - 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?
解决方案
这两种方法是等价的。不同的是,在第二种情况下,简单的静态分析可以确定没有对象注入,因为对象索引中没有使用变量。在第一种情况下,eslint 无法判断这k
是一个安全索引,但我们可以轻松判断它,因为Object.keys()
它不返回用户输入。
第一个版本中的警告是误报。对象注入仅在密钥来自不受信任的来源时发生,因为它允许他们访问对象的任何属性。但是,如果您在代码中生成属性列表,则它不是注入。误报的发生是因为 eslint 不知道从哪里来k
,foo[k]
所以它假设最坏的情况。
阅读方括号符号的危险
如果您的意图是处理所有属性,那么当您k
从Object.keys()
. 出于同样的原因,使用 时没有对象注入Object.entries()
,因为它获得了相同的键和值。
推荐阅读
- laravel - 使用 Alpine 创建一个“始终打开的日期选择器”| 活线
- quasar - q-layout 中是否有一种方法可以在类星体中滚动到顶部?
- react-native - 如何在 React Native 中将 ViewPager 合并到 Stack Navigator 中
- jpa - JPQL 查询参数中的时间戳未转换为 UTC
- r - 使用 cut 为变量创建组,我将如何在 ggplot 中使用它?
- javascript - 数据库无法从 crawl.php 获取数据
- google-apps-script - 需要删除以逗号分隔的重复数字的脚本
- python - 如何为我的登录和注册页面编写成功页面?
- python - python中多列的层次映射
- java - 尝试使用 ElasticSearch 存储和获取一些数据