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中引入的。