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

How do I dynamically generate code that will transfer an object to another Node process

本文关键字:另一个 转移 Node 进程 代码 对象 何动态 动态      更新时间:2023-09-26

我正在构建一个节点服务器,它需要执行可能不安全的代码。为了实现这一点,我使用了一个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;

在这样做之后,并试图将其写给孩子,我会遇到奇怪的(和神秘的错误),比如:"意外的令牌{"或(很少更神秘的)"意外的代币非法"(这很令人困惑,因为我已经验证了我在代码中没有插入',而测试代码中也没有)

放克化的字符串是{"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;

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