首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

no-eval

JavaScript的eval()功能是潜在的危险,经常被滥用。eval()在不受信任的代码上使用可以打开一个程序,最多可以进行多种不同的注入攻击 eval()在大多数情况下的使用可以取代对问题更好的替代方法。

代码语言:javascript
复制
var obj = { x: "foo" },
    key = "x",
    value = eval("obj." + key);

规则细节

该规则旨在通过禁止使用eval()函数来防止潜在的危险,不必要的和慢速的代码。因此,无论何时使用该eval()功能,它都会发出警告。

此规则的错误代码示例:

代码语言:javascript
复制
/*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时,此规则的其他不正确代码示例:

代码语言:javascript
复制
/*eslint no-eval: "error"*/
/*eslint-env browser*/

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

当节点环境设置为true时,此规则的附加不正确代码示例:

代码语言:javascript
复制
/*eslint no-eval: "error"*/
/*eslint-env node*/

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

此规则的正确代码示例:

代码语言:javascript
复制
/*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更不危险,因为它们不能动态更改范围。 正因为如此,它们也不会对性能造成直接影响。

代码语言:javascript
复制
{
    "no-eval": ["error", {"allowIndirect": true}] // default is false
}

此规则的错误代码示例包含以下{"allowIndirect": true}选项:

代码语言:javascript
复制
/*eslint no-eval: "error"*/

var obj = { x: "foo" },
    key = "x",
    value = eval("obj." + key);

此规则的正确代码示例包含以下{"allowIndirect": true}选项:

代码语言:javascript
复制
/*eslint no-eval: "error"*/

(0, eval)("var a = 0");

var foo = eval;
foo("var a = 0");

this.eval("var a = 0");
代码语言:javascript
复制
/*eslint no-eval: "error"*/
/*eslint-env browser*/

window.eval("var a = 0");
代码语言:javascript
复制
/*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”);};
  • 此规则无法捕获重命名全局对象。 如:var foo = window; foo.eval(“var a = 0”);

扩展内容

相关规则

  • no-implied-eval

版本

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

资源

扫码关注腾讯云开发者

领取腾讯云代金券