gpt4 book ai didi

javascript - 调用绕过 eval() 的函数

转载 作者:行者123 更新时间:2023-12-02 16:17:05 27 4
gpt4 key购买 nike

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

eval(myString)

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

我无法控制要调用的函数,因为我将该函数作为字符串(此处为 myString)获取。该函数的参数也是同一字符串的一部分。

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

最佳答案

我对允许用户提供函数名称有点怀疑,但是......假设您在变量中有函数名称,在变量中有 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 实际上不是变量名,而是某种文字或可能是任意表达式,则这会变得更加复杂,而且安全性也降低了。)

关于javascript - 调用绕过 eval() 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29482098/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com