0

我需要允许用户配置库中的哪些函数应该由服务器端 Javascript 进程运行。用户可以在文本框中输入此函数列表(空格分隔)。当进程运行时,它按空格分割列表,然后使用以下语句找到并运行每个函数:

var curFunction = eval(functionName); curFunction();

除了我们的内部开发人员之外,没有人可以设置要运行的函数列表,但我还是想保护这一点,因为服务器端脚本可以改变我们的数据库。

我的问题是,通过拒绝与以下一项或多项匹配的任何 functionName 参数,我是否做得足以保护我们的数据库:

  1. 正则表达式 /[^A-Za-z0-9_]/
  2. Javascript关键字的正则表达式 /^\s*nlapi|^\s*nlobj|^\s*break\s*$|^\s*case\s*$|^\s*catch\s*$|^ \s*continue\s*$|^\s*debugger\s*$|^\s*default\s*$|^\s*delete\s*$|^\s*do\s*$|^ \s*else\s*$|^\s*finally\s*$|^\s*for\s*$|^\s*function\s*$|^\s*if\s*$|^ \s*in\s*$|^\s*instanceof\s*$|^\s*new\s*$|^\s*return\s*$|^\s*switch\s*$|^ \s*this\s*$|^\s*throw\s*$|^\s*try\s*$|^\s*typeof\s*$|^\s*var\s*$|^ \s*void\s*$|^\s*while\s*$|^\s*with\s*$/

这个想法是将输入限制为函数名称,但不允许任何其他内容,如括号或关键字,因此用户不应该能够使任何工作除了函数变量分配之外。

有什么办法可以绕过这个吗?函数不需要采用不同的参数,所以我们只需要函数名。

4

1 回答 1

2

这是你应该做的:

var functions = {
    "doSomething":function() {...},
    "somethingElse":function() {...},
    "dontMessUp":function() {...}
};

像这样定义有效函数后,只需调用:

var functionName = "doSomething";
functions[functionName] && functions[functionName]();
于 2013-10-21T16:37:51.673 回答