Eslint
规则 | Rules

no-eval

Disallow eval() (no-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"

浏览器环境设置为true时,此规则的其他不正确代码示例:

/*eslint no-eval: "error"*/ /*eslint-env browser*/ window.eval("var a = 0"

当节点环境设置为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() { } }

选项

此规则有一个允许间接调用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()。 此行为是为了检测直接评估的调用。 如:module.exports = function(eval){//如果这个eval的值是内置的eval函数,这是//直接eval的调用。 eval(“var a = 0”);};

扩展内容

相关规则

  • no-implied-eval

版本

这条规则是在ESLint 0.0.2中引入的。

资源