Я создаю сервер узлов, который должен выполнять код, который может быть небезопасным. Чтобы добиться этого, я использую API Sandbox, который блокирует атаки и возвращает результат и вывод из скрипта. Он использует модифицированный глобальный объект, чтобы скрыть доступ к глобальному объекту Node (и использовать require ... и т. Д.).
Моя конкретная потребность сейчас состоит в том, чтобы взять объект, который определен пользователем (это все заслуживает доверия, ничего от случайных пользователей в Интернете, поэтому безопасность не самая большая проблема в данный момент, сейчас это получить его работает) и создает динамический фрагмент кода, который будет «передавать» объект вместе со своим кодом в дочерний процесс Node для безопасного выполнения (здесь безопасность такова, что любые ошибки не приводят к сбою основного процесса).
Моя текущая цель - взять объект, как показано ниже:
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), а затем попытался запустить eval
для строки в REPL узла, но я продолжаю получить ...
при попытке eval(JSON.stringify(objWithoutFunctions));
и то же самое с FJSON.
Я боролся с этой проблемой уже несколько часов и не могу думать ни о каких других вещах, которые можно попробовать / проверить. Любые предложения приветствуются.
UPDATE
Я до сих пор не смог определить наиболее эффективный способ сделать это, так как не работало сформатирование объекта и его передача вместе с кодом, и я не смог заставить его работать нормально. Я вернулся к преобразованию объекта в код, по существу, циклически просматривая свойства и присваивая переменные вручную. Для примера:
Объект:
obj = {
prop: "ItsValue",
otherProp: true
};
станет:
this.prop = "ItsValue"; this.otherProp = true;