好的做法?通过WebSockets发送的JSON的Eval函数

时间:2014-05-02 21:50:11

标签: json node.js websocket

我正在考虑以下架构。通过websockets连接到服务器的客户端将JSON包发送到服务器。除了其他数据之外,JSON内部还有" action":" somefunction();"。然后服务器将解析JSON,如果操作不为空,则它将eval,从而运行该命令。

替代方法是简单地放一个字符串" somefunction"在action属性中,并在服务器上有一个switch语句来运行相应的代码。

思想或其他可能性?

2 个答案:

答案 0 :(得分:0)

您所描述的内容并不能阻止恶意客户端发送任意代码来执行。 这是一个安全漏洞。

如果您希望客户端代码触发服务器上的某些功能,则传递服务器将解析的一些数据并检查以确保仅执行相应的代码。它可以是这样的JSON结构,客户端发送:

{
    "name": "foo",
    "arguments": ["a", "b", "c"]
}

当服务器收到它并用JSON.parse解析它时,它会验证name是否为有效值并调用相应的函数。这些函数可以是这样的结构

var dispatch = {
    foo: function (a, b, c) { },
    bar: function (a) { }
    // etc...
}

一旦解析了JSON数据并将其存储到名为data的变量(例如)中,调用就可以是:

dispatch[data.name].apply(undefined, data.arguments)

如果需要,返回数据也可以作为JSON结构返回给客户端。

答案 1 :(得分:-1)

如果我使用动态数据按名称调用函数,我倾向于使用window["function_name_as_string"](param1,param2);