Spec-Zone.ru › ESLint

no-eval

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

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

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

Подробное описание правила

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

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

Открыть в Playground
/*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");

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

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

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

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

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

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

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

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

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() {
    }
}

Параметры

allowIndirect

Это правило имеет параметр для разрешения “косвенного вызова eval”. Косвенные вызовы eval менее опасны, чем прямые вызовы eval, потому что они не могут динамически изменять область видимости. Из-за этого они также не будут негативно влиять на производительность в той степени, что прямые eval

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

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

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

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

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

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

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

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

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

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

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

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

  • no-неявный-eval

Версия

Это правило было добавлено в ESLint v0.0.2.

Дополнительные материалы для чтения

Eval это зло, часть первая
Насколько злоевольное eval?

Источники

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

© 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