在所有实例中使用新的Function()是不安全的吗?

时间:2018-05-14 08:42:20

标签: javascript function security template-literals

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

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将其标记为一个吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

许多被称为“冒险”的事情本身并不是固有的安全风险,如果实施不当,它们只是潜在的安全风险。这是其中一个案例。您可以拥有类似

的脚本
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"));