我需要允许用户配置库中的哪些函数应该由服务器端 Javascript 进程运行。用户可以在文本框中输入此函数列表(空格分隔)。当进程运行时,它按空格分割列表,然后使用以下语句找到并运行每个函数:
var curFunction = eval(functionName); curFunction();
除了我们的内部开发人员之外,没有人可以设置要运行的函数列表,但我还是想保护这一点,因为服务器端脚本可以改变我们的数据库。
我的问题是,通过拒绝与以下一项或多项匹配的任何 functionName 参数,我是否做得足以保护我们的数据库:
- 正则表达式 /[^A-Za-z0-9_]/
- 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*$/
这个想法是将输入限制为函数名称,但不允许任何其他内容,如括号或关键字,因此用户不应该能够使任何工作除了函数变量分配之外。
有什么办法可以绕过这个吗?函数不需要采用不同的参数,所以我们只需要函数名。