Безопасное распространение приложений NodeJS - PullRequest
59 голосов
/ 23 февраля 2012

Что: Можно ли распространять приложения NodeJS в двоичном формате?то есть.вы компилируете приложение .js через V8 в его собственный двоичный файл и распространяете двоичный файл среди клиентов?(если у вас был полный доступ к серверу NodeJS) ... или все, что вы можете сделать, минимизировать код?

Почему: Мы создаем серверные приложения в NodeJS для клиентов, которые частобыть размещенным на серверах клиента.Распространение исходного кода означает, что клиенты могут легко украсть наше решение и прекратить платить лицензионные сборы.Это открывает возможность простого реверс-инжиниринга или повторного использования наших приложений без нашего ведома.

Ответы [ 5 ]

23 голосов
/ 28 сентября 2012

Да, это возможно, используйте эту ветку (на основе 0.8.18), и любой код js, который вы поместите в 'deps / v8 / src / extra-snapshot.js', будет опережать время скомпилировано в машинный код и встроено в v8 как часть обычной инициализации встроенного объекта. Вам нужно будет собрать nodejs для каждой платформы, на которой вы собираетесь развернуть свой продукт.

Снимок кода выполняется очень рано при инициализации v8, и вы не можете получить доступ к встроенным объектам в «теле модуля». Что вы можете сделать, так это поместить весь свой код в глобальную функцию инициализации, которая будет вызвана позже. Пример:

// 'this' points to the same as the object referenced by 
// 'global' in normal nodejs code.
// at this point it has nothing defined in it, so in order to use
// global objects a reference to it is needed.
var global = this;
global.initialize = function() {
  // You have to define all global objects you use in your code here;
  var Array = global.Array;
  var RegExp = global.RegExp;
  var Date = global.Date;
  // See ECMAScript v5 standard global objects for more
  // Also define nodejs global objects:
  var console = global.console;
  var process = global.process;
  // Your code goes embedded here
};

Кроме того, это предполагает, что весь ваш код определен в одном файле, поэтому, если ваш проект использует модульную систему nodejs (требуется), вам нужно написать скрипт, который объединит все ваши файлы в один и обернет каждый файл в замыкание, которое обманом заставит ваш код думать, что это обычный модуль nodejs. Вероятно, закрытие каждого модуля предоставит функцию require, и эта функция должна будет решить, когда делегировать стандартному «global.require» или вернуть экспорт из ваших других встроенных модулей. Посмотрите, как системы модулей javascript реализованы для идей (хороший пример - requirejs).

Это затруднит отладку вашего кода, поскольку вы не увидите трассировки стека для нативного кода.

UPDATE:

Даже при использовании снимков v8 код внедряется в двоичный файл node.js, поскольку v8 предпочитает отложенную компиляцию. См. это для получения дополнительной информации.

21 голосов
/ 24 февраля 2012

Да, вы можете создать двоичный формат. V8 позволяет предварительно скомпилировать JavaScript. Обратите внимание, что это может иметь ряд странных побочных эффектов для предположений, сделанных ядром узла.

Распространение исходного кода означает, что клиенты могут легко украсть наше решение и прекратить платить лицензионные сборы.

То, что вы распространяете двоичный файл, не защищает вас от кражи. Они все еще могут украсть двоичный код или разобрать его. Это защита через мрак, которая вообще не является защитой.

Лучше дать им приложение для тонких клиентов, которое будет взаимодействовать с вашим сервером и обеспечивать безопасность кода вашего сервера, не передавая его.

8 голосов
/ 16 марта 2015

EncloseJS .

Вы получаете полнофункциональный двоичный файл без источников.

Код JavaScript преобразуется в собственный код во время компиляции с использованием внутреннего компилятора V8. Следовательно, ваши источники не обязаны выполнять двоичный файл, и они не упакованы.

Идеально оптимизированный нативный код может быть сгенерирован только во время выполнения на основе компьютера клиента. Без этой информации EncloseJS может генерировать только «неоптимизированный» код. Он работает примерно в 2 раза медленнее, чем NodeJS.

Кроме того, код времени выполнения node.js помещается в исполняемый файл (вместе с вашим кодом) для поддержки API узла для вашего приложения во время выполнения.

Варианты использования:

  • Сделайте коммерческую версию своего приложения без источников.
  • Создайте демо / ознакомительную / пробную версию своего приложения без исходников.
  • Создайте какой-нибудь самораспаковывающийся архив или установщик.
  • Создание приложения с графическим интерфейсом с закрытым исходным кодом с использованием node-thrust.
  • Нет необходимости устанавливать узел и npm для развертывания скомпилированного приложения.
  • Нет необходимости загружать сотни файлов через npm install для развертывания вашего приложения. Разверните его как отдельный независимый файл.
  • Поместите свои активы в исполняемый файл, чтобы сделать его еще более переносимым. Протестируйте ваше приложение с новой версией узла, не устанавливая его.
3 голосов
/ 22 сентября 2013

В настоящее время я изучаю ту же вещь и смотрю на nexe , который утверждает, что может "создать один исполняемый файл из ваших приложений node.js".

Пока не могу сказать, хорошо ли это, но подумал, что уже стоит поделиться.

2 голосов
/ 16 февраля 2015

V8 самостоятельно генерирует машинный код и выполняет его.Смотрите здесь: https://github.com/v8/v8-git-mirror/blob/master/src/compiler.cc#L1178.Эта функция используется в EncloseJS .EncloseJS анализирует источники вашего проекта node.js, объединяет зависимости и создает исполняемый двоичный файл.Исходники не включены в двоичный - только скомпилированный машинный код.

...