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