如何动态生成将对象传输到另一个Node进程的代码

时间:2012-03-30 01:16:01

标签: javascript json node.js eval

我正在构建一个需要执行可能不安全的代码的节点服务器。为了实现这一点,我使用了一个Sandbox API来阻止攻击并返回脚本的结果和输出。它使用修改后的全局对象来保持对Node全局对象的访问(以及require ...等的使用)。

我现在的具体需求是拿一个由用户定义的对象(这一切都是受信任的,互联网上的随机用户都没有,因此安全性不是目前最关心的问题,现在就是获取它工作)并创建一个动态的代码片段,将对象及其代码“传输”到子节点进程以便安全执行(这里的安全性使得任何错误都不会使主进程崩溃)。

我目前的目标是获取一个对象,如下所示:

obj = {
  defaultName: "Unnamed",
  hello: function(name) {
    if (typeof name === "undefined" || name === null)
      name = this.defaultName;
    echo("Hello, " + name + "!");
  }
}

(这非常简单,它用于测试)

我正在使用FJSON来序列化传输函数。我尝试使用代码将其序列化以进行传输,如下所示:

// "code" is the users code
// "obj" is the object above
// "Extend" is a function defined by the Child process
var str = FJSON.funkify(obj);
code = "var temp = FJSON.unfunkify(\"" + str + "\"); Extend(this, temp); temp = undefined; " + code;

在这样做之后,并尝试将其写入孩子,我得到了奇怪的(和神秘的错误),如:“意外的令牌{”或(很少和更加神秘)“意外的令牌ILLEGAL'”(这,这是令人困惑的,因为我已经验证了代码中没有任何地方我插入'并且测试代码中没有。)

funkified字符串是{"defaultName": "Unnamed","hello":{"FUNCTION":true,"params":["name"],"body":"\n\r if (typeof name === \"undefined\" || name === null)\n\r name = this.defaultName;\n\r echo(\"Hello, \" + name + \"!\");\n\r "}}

最后,为了测试,我尝试序列化一个简单的对象(没有使用JSON的函数,使用FJSON的函数),然后尝试在Node REPL中的字符串上运行eval但是当我尝试...时,我会继续eval(JSON.stringify(objWithoutFunctions));,而与FJSON相同。

我已经在这个问题上挣扎了几个小时了,并且想不出任何其他事情要尝试/检查。任何建议都表示赞赏。

更新

我仍然无法确定最有效的方法,因为对象进行字符串化并将其与代码一起传输不起作用,我无法让它很好地工作我已经恢复将对象转换为代码,基本上循环遍历属性并手动分配变量。举例来说:

对象:

obj = {
  prop: "ItsValue",
  otherProp: true
};

会变成:

this.prop = "ItsValue"; this.otherProp = true;

1 个答案:

答案 0 :(得分:0)

我找到了Update中列出的解决方法,我只是将对象转换为代码。这可能是我从那时起修复过的FJSON库的问题。这不再是一个问题,但我仍然欢迎任何可能解决原始问题的答案。