版本

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

此規則使用 window 全域變數的其他不正確程式碼範例

在線上編輯器中開啟
/*eslint no-eval: "error"*/
/*global window*/

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

此規則使用 global 全域變數的其他不正確程式碼範例

在線上編輯器中開啟
/*eslint no-eval: "error"*/
/*global global*/

global.eval("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 = eval("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 中引入的。

延伸閱讀

資源

變更語言