no-eval
Запрещает использование eval()
Функция eval() в JavaScript потенциально опасна и часто используется неправильно. Использование eval() для недоверенного кода может сделать программу уязвимой для различных атак с внедрением кода. В большинстве случаев использование eval() можно заменить более подходящим альтернативным решением.
const obj = { x: "foo" },
key = "x",
value = eval("obj." + key);
Описание правила
Это правило предназначено для предотвращения потенциально опасного, ненужного и медленного кода путем запрета использования функции eval(). Поэтому предупреждение будет выдаваться при каждом использовании функции eval().
Примеры неправильного кода для этого правила:
/*eslint no-eval: "error"*/
const obj = { x: "foo" },
key = "x",
value = ("obj." + key);
(0, )("const a = 0");
const foo = ;
foo("const a = 0");
// This `this` is the global object.
this.("const a = 0");
Пример дополнительного неправильного кода для этого правила с глобальной переменной window:
/*eslint no-eval: "error"*/
/*global window*/
window.("const a = 0");
Пример дополнительного неправильного кода для этого правила с глобальной переменной global:
/*eslint no-eval: "error"*/
/*global global*/
global.("const a = 0");
Примеры правильного кода для этого правила:
/*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}:
/*eslint no-eval: ["error", {"allowIndirect": true} ]*/
const obj = { x: "foo" },
key = "x",
value = ("obj." + key);
Примеры правильного кода для этого правила с параметром {"allowIndirect": true}:
/*eslint no-eval: ["error", {"allowIndirect": true} ]*/
(0, eval)("const a = 0");
const foo = eval;
foo("const a = 0");
this.eval("const a = 0");
/*eslint no-eval: ["error", {"allowIndirect": true} ]*/
/*global window*/
window.eval("const a = 0");
/*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");
Связанные правила
Версия
Это правило появилось в ESLint v0.0.2.
Дополнительная литература
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-eval