Безопасное распространение приложений NodeJS

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

// '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 (требуется), вам нужно написать script, который объединит все ваши файлы в одном и обернет каждый файл в закрытие, которое обманет ваш код, подумав, что это обычный модуль nodejs. Вероятно, каждое закрытие модуля будет вызывать функцию require, и эта функция должна будет решить, когда делегировать стандартное "global.require" или возвращать экспорт из ваших других встроенных модулей. Посмотрите, как внедряются системы модулей javascript для идей (хороший пример - requirejs).

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

UPDATE:

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

Ответ 3

EncloseJS.

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 7

Вы можете попробовать nexe.

npm i nexe -g