Spec-Zone.ru › ESLint

no-eval

Запрещает использование eval()

Функция eval() в JavaScript потенциально опасна и часто используется неправильно. Использование eval() для недоверенного кода может сделать программу уязвимой для различных атак с внедрением кода. В большинстве случаев использование eval() можно заменить более подходящим альтернативным решением.

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

Описание правила

Это правило предназначено для предотвращения потенциально опасного, ненужного и медленного кода путем запрета использования функции eval(). Поэтому предупреждение будет выдаваться при каждом использовании функции eval().

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint no-eval: "error"*/

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

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

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

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

Пример дополнительного неправильного кода для этого правила с глобальной переменной window:

Открыть в Playground
/*eslint no-eval: "error"*/
/*global window*/

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

Пример дополнительного неправильного кода для этого правила с глобальной переменной global:

Открыть в Playground
/*eslint no-eval: "error"*/
/*global global*/

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

Примеры правильного кода для этого правила:

Открыть в Playground
/*eslint no-eval: "error"*/

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

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

    eval() {
    }

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

    static eval() {
    }
}

Параметры

allowIndirect

У этого правила есть параметр, позволяющий использовать «косвенный eval». Косвенные вызовы eval менее опасны, чем прямые вызовы eval, поскольку они не могут динамически изменять область видимости. Поэтому они также не оказывают такого негативного влияния на производительность, как прямой eval.

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

Пример неправильного кода для этого правила с параметром {"allowIndirect": true}:

Открыть в Playground
/*eslint no-eval: ["error", {"allowIndirect": true} ]*/

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

Примеры правильного кода для этого правила с параметром {"allowIndirect": true}:

Открыть в Playground
/*eslint no-eval: ["error", {"allowIndirect": true} ]*/

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

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

this.eval("const a = 0");
Открыть в Playground
/*eslint no-eval: ["error", {"allowIndirect": true} ]*/
/*global window*/

window.eval("const a = 0");
Открыть в Playground
/*eslint no-eval: ["error", {"allowIndirect": true} ]*/
/*global global*/

global.eval("const 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("const a = 0");
    };
    
  • Это правило не может обнаружить переименование глобального объекта. Например:

    const foo = window;
    foo.eval("const a = 0");
    

Связанные правила

  • no-implied-eval

Версия

Это правило появилось в ESLint v0.0.2.

Дополнительная литература

Eval — это зло, часть первая
ericlippert.com
Насколько вреден eval?
javascriptweblog.wordpress.com

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-eval

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API