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

browser 环境设置为 true 时,此规则的附加错误代码示例:

/*eslint no-eval: "error"*/
/*eslint-env browser*/

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

node 环境设置为 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 thisevalis built-inevalfunction, this is a // call of directeval. eval("var a = 0"); };

  • 此规则无法捕获重命名全局对象。如: var foo = window; foo.eval("var a = 0");

Last Updated: 5/13/2023, 8:55:38 PM