JS.BASE.NO.EVAL

'eval()' の使用を禁止する

JavaScript の eval() 関数は、潜在的に危険であり、誤用されることがしばしばあります。信頼できないコードで eval() を使用すると、プログラムをいくつかの異なるインジェクション攻撃にさらす可能性があります。ほとんどのコンテキストで eval() を使用することは、問題へのより良い代替アプローチの代わりになる可能性があります。

コピー
var obj = { x: "foo" },
    key = "x",
    value = eval("obj."+ key);

規則の詳細

この規則は、eval() 関数の使用を禁止することで、潜在的に危険で不要な遅いコードを阻止することを目的としています。したがって、eval() 関数が使用されるたびに警告されます。

この規則で正しくないコードの例:

コピー
/*eslint no-eval: "error"*/

var obj = { x: "foo" },
    key = "x",
    value = eval("obj."+ key);

(0, eval)("var a = 0");

var foo = eval;
foo("var a = 0");

// This `this` is the global object.
this.eval("var a = 0");

ブラウザー環境が true に設定されている場合での、この規則で正しくない追加コードの例:

コピー
/*eslint no-eval: "error"*/
/*eslint-env browser*/

window.eval("var a = 0");

ノード環境が true に設定されている場合での、この規則で正しくない追加コードの例:

コピー
/*eslint no-eval: "error"*/
/*eslint-env node*/

global.eval("var a = 0");

この規則で正しいコードの例:

コピー
/*eslint no-eval: "error"*/
/*eslint-env es6*/

var obj = { x: "foo" },
    key = "x",
    value = obj[key];

class A {
    foo() {
        // This is a user-defined method.
        this.eval("var a = 0");
    }

    eval() {
    }

    static {
        // This is a user-defined static method.
        this.eval("var a = 0");
    }

    static eval() {
    }
}

オプション

この規則には、eval への間接呼び出しを許可するオプションがあります。 eval への間接呼び出しは、スコープを動的に変更できないため、eval への直接呼び出しよりも危険ではありません。このため、直接 eval の程度まで、パフォーマンスに悪影響を及ぼすこともありません。

コピー
{
    "no-eval": ["error", {"allowIndirect": true}] // default is false
}

{"allowIndirect": true} オプションによる、この規則で正しくないコードの例:

コピー
/*eslint no-eval: "error"*/

var obj = { x: "foo" },
    key = "x",
    value = eval("obj."+ key);

{"allowIndirect": true} オプションによる、この規則で正しいコードの例:

コピー
/*eslint no-eval: "error"*/

(0, eval)("var a = 0");

var foo = eval;
foo("var a = 0");

this.eval("var a = 0");
コピー
/*eslint no-eval: "error"*/
/*eslint-env browser*/

window.eval("var a = 0");
コピー
/*eslint no-eval: "error"*/
/*eslint-env node*/

global.eval("var a = 0");

既知の制限事項

  • この規則は、 eval()のたびに、 evalがグローバルのものでない場合でも 警告します。 これは、直接 eval の呼び出しを検出するための動作です。例:
コピー
  module.exports = function(eval) {
      // If the value of this `eval` is built-in `eval` function, this is a
      // call of direct `eval`.
      eval("var a = 0");
  };
  • この規則は、グローバルのオブジェクトの名前変更をキャッチできません。例:
コピー
  var foo = window;
  foo.eval("var a = 0");

このページの内容は、ESLint ユーザーガイドから編集されたものです。Copyright © OpenJS Foundation and other contributors, www.openjsf.org. All rights reserved. https://eslint.org/docs/rules/