调用绕过eval()的函数

时间:2015-04-07 01:09:05

标签: javascript eval

我正在使用使用eval函数的Javascript代码。

eval(myString)

myString = myFunc(arg)的值,我想直接调用myFunc而不使用eval。

我没有对要调用的函数的任何控制,因为我将该函数作为String(此处为myString)。 该函数的参数也是同一个字符串的一部分。

那么,有没有办法可以在不使用eval的情况下调用预期的函数?

3 个答案:

答案 0 :(得分:2)

我对允许用户提供函数名称有点怀疑,但是......假设你在变量中有函数名,在变量中有arg的值。悬臂:

var myString = window[fn](arg);

arg可能已经在争论中了,所以这很简单。下一部分是扩展函数名称。只是一点正则表达式:

var fn = /^([a-z0-9_]+)\(arg\)$/i.exec(str)[1];
if (fn && typeof window[fn] === 'function') {
  window[fn](arg);
}

这当然假设该函数始终在全局范围内,但如果不是,则应该能够相应地进行调整。另外,我的正则表达式是我想出的第一件事。它可能没有涵盖所有可能的函数名称。

如果你想将字符串限制为一组特定的函数(你几乎肯定应该这样),那么一旦你有了函数名,这就变得非常容易了:

var allowedFunctions = {fn1: fn1, fn2: fn2, someOtherFunction: function() {} },
    fn = /^([a-z0-9_]+)\(arg\)$/i.exec(str)[1];

if (fn && allowedFunctions[fn]) {
    allowedFunctions[fn](arg);
} else {
    // Hah, nice try.
}

(如果arg实际上不是变量名,而是某种文字或可能是任意表达式,这会变得更复杂,更不安全。)

答案 1 :(得分:0)

除了使用eval之外,JavaScript不提供任何调用表示为字符串的函数的方法。但是,使用它并没有错。鉴于你没有其他选择。

答案 2 :(得分:0)

您可以尝试使用Function

var sure = function(s) {
  return confirm(s);
};
var str = 'sure("Are you sure?")';
var rtn = new Function('return ' + str)();
alert(rtn);