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 = ("obj." + key);
(0, )("var a = 0");
var foo = ;
foo("var a = 0");
// This `this` is the global object.
this.eval("var a = 0");
此規則使用 window
全域變數的其他不正確程式碼範例
在線上編輯器中開啟
/*eslint no-eval: "error"*/
/*global window*/
window.("var a = 0");
此規則使用 global
全域變數的其他不正確程式碼範例
在線上編輯器中開啟
/*eslint no-eval: "error"*/
/*global global*/
global.("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 = ("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 中引入的。