在所有情况下都使用 new Function() 不安全吗?

Is using new Function() unsafe in all instances?

我正在开发一个创建新函数的项目,然后 returns 一个评估的模板字符串。我的代码是这样的:

var myString = "${hello}"
var myFunc = new Function("hello", 'return `' + myString + '`')
document.getElementById("tdiv").innerHTML = myFunc("whassup")

它运行完美,正如您在我的 JSFiddle 上看到的那样:https://jsfiddle.net/nebrelbug/28c7hfm8/。但是,这是否存在安全风险?函数自动严格使用,所以它不能访问我传入的变量以外的变量。我根本看不出这会对安全性产生什么影响。

如果存在安全风险,请说明原因。如果不是,大多数安全评估者(如 'npm audit' 或 Github 会将其标记为一个吗?

谢谢!

许多被认为是 "risky" 的事情本身并不是 固有的 安全风险,它们只是 潜在的 安全风险如果执行不当。这是其中一个案例。你可以有一个像

这样的脚本
const foo = 'foo';
const bar = eval('foo');

此代码与其他代码完全一样,显然不存在安全风险,但您不一定指望安全评估人员能够完全准确地验证您的实施方式是否确实 安全与否 - 他们使用程序启发式方法,而不是人类安全专家检查您的代码是否存在漏洞。因此,使用 eval 及其类似 new Function 与不安全代码 更密切相关

在我的代码片段中,就像您的代码一样,即使它不存在安全风险,它仍然是实现您目标的非常不优雅的方式。尝试找到实现它的更好方法。例如:

var myString = "foo ${hello} bar";
function myFunc(replaceHelloWith) {
  return myString.replace(/$\{hello\}/g, replaceHelloWith);
}
console.log(myFunc("whassup"));