使用字符串输入使用eval通过名称将函数分配给变量有什么风险?

时间:2013-10-21 16:33:36

标签: javascript regex security eval server-side

我需要允许用户配置库中的哪些函数应该由服务器端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 *继续\ S * $ | ^ \ S *调试器\ S * $ | ^ \ S *默认\ S * $ | ^ \ S *删除\ S * $ | ^ \ S *做\ S * $ | ^ \ S *其他\ S * $ | ^ \ S *终于\ S * $ | ^ \ S *为\ S * $ | ^ \ S *功能\ S * $ | ^ \ S *如果\ S * $ | ^ \ S的\ S * $ * | ^ \ S *的instanceof \ S * $ | ^ \ S *新\ S * $ | ^ \ S *回报\ S * $ | ^ \ S *切换\ S * $ | ^ \ S *本\ S * $ | ^ \ S *扔\ S * $ | ^ \ S *尝试\ S * $ | ^ \ S * typeof运算\ S * $ | ^ \ S *变种\ S * $ | ^ \ S *空隙\ S * $ | ^ \ S *而\ S * $ | ^ \ S *与\ S * $ /
  3. 我们的想法是将输入限制为函数名称,但不允许使用括号或关键字等任何其他内容,因此除了函数变量赋值之外,用户不应该做任何工作。

    有什么方法可以狡猾吗?这些函数不需要使用不同的参数,因此我们只需要函数名称。

1 个答案:

答案 0 :(得分:2)

这是你应该做的:

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

一旦你有了这样定义的有效函数,只需调用:

var functionName = "doSomething";
functions[functionName] && functions[functionName]();