【问题标题】:How to properly handle ESLint 'detect-object-injection'如何正确处理 ESLint \'detect-object-injection\'
【发布时间】:2022-09-24 03:24:02
【问题描述】:

在我们的 Angular 项目中,ESLint 大喊:

\"将变量 [key] 检测为左手或右手赋值操作数。\"

这是detect-object-injection 规则。并说:

//Bad:
variable[key] = value;

作为证明,请提供以下link 的描述。

我不会开始争辩说这条规则很糟糕。

但我对如何解决它很感兴趣。关于的链接有解决方案:

这里最直接的解决方法是避免在属性名称字段中使用用户输入。然而,这并非在所有情况下都是合理的,并且应该有一种方法可以安全地使用核心语言功能。

另一种选择是创建允许的属性名称的白名单,并通过帮助函数过滤每个用户输入,以便在允许使用之前进行检查。在您明确知道允许使用哪些属性名称的情况下,这是一个很好的选择。

如果您没有严格定义的数据模型(这并不理想,但在某些情况下必须如此),则使用与上述相同的方法,但使用不允许的属性黑名单代替一个有效的选择。

所以第一个选项“不要使用它”是不可接受的,因为我的密钥是动态的,括号表示法是访问该属性的唯一方法。

第二种解决方案也不适合我,因为我没有也无法创建允许的属性名称的白名单。

因此,我拥有的最后一个选项是使用禁止属性的黑名单。但问题是:这个黑名单在哪里拿,如何申请?它没有示例,我很感兴趣如何在 Angular 中正确实现它。

提前致谢!

更新: 由于我的问题并不完全清楚,我将再解释一次。

我的代码是:

someObject[someDynamicKey] = \'someValue\';

eslint 将此行视为不好的问题。因为通过方括号表示法设置对象属性。 EsLint 说这很危险。所以我问如果不可能用点符号访问对象属性,我们该怎么办?例子?谢谢!

Explanation why Square Bracket Notation is Dangers 根据 ESLint。

  • 如何利用keyof typescript
  • @brk 您是否建议将对象原型制作为keyof,然后将其用作黑名单?
  • 你没有展示足够多的代码让我们能够提出有意义的建议。
  • @JuanMendes 整个代码是 someObject[someKey] = \'value\'; - eslint 抱怨设置使用括号表示法访问它的对象键值是不好的,我们不应该这样做。所以我问我们该怎么做。
  • @Experimenter 不,整个代码将包含足够的代码以确保没有未定义的变量,例如 someObjectsomeKey。我意识到这一行本身就足以触发 eslint 错误,但还不足以让我们知道为什么需要动态属性。请看stackoverflow.com/help/minimal-reproducible-example

标签: javascript angular typescript eslint typescript-eslint


【解决方案1】:

看起来您正在使用一个对象作为键/值存储,它通常与Map 相关联。

请改用地图,因为它不会接触对象属性,并且键不会与对象的本机属性发生冲突。

const variable = new Map();
...

variable.set(key, value);

【讨论】:

  • 你好谢谢。没有问题不是它。我已经更新了这个问题。问题是 EsLint 抱怨通过“方括号表示法”访问对象属性根本不是一个好主意,我们应该坚持使用点表示法。但是,如果无法通过点表示法访问对象属性怎么办?在这种情况下我们应该怎么做,例子?我知道这听起来很奇怪,但是 eslint 抱怨什么。 github.com/nodesecurity/eslint-plugin-security/blob/master/docs/…
  • @Experimenter 我不明白你的意思。我建议您使用 Map 而不是普通的 JS 对象。这对我来说并不奇怪。您似乎没有完全理解为什么存在该规则。正如我所解释的,如果您使用的是具有括号访问权限的对象,则很可能您应该使用 Map 代替。
  • @Experimenter 你有没有尝试过我的建议?如果您解释了为什么您不能使用该解决方案并更新您的问题以包含此类信息以供其他人使用,您的回复会更有用。
【解决方案2】:

有时您需要回答自己的问题:https://stackoverflow.com/a/73641926/4079915

一般来说,这条规则不应该用于 CI 或任何其他自动化检查,因为它是错误的:https://github.com/nodesecurity/eslint-plugin-security/issues/21#issuecomment-326031625

【讨论】:

    猜你喜欢
    • 2021-07-26
    • 2020-02-26
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多