web-dev-qa-db-fra.com

Distribution sécurisée des applications NodeJS

Quoi: Les applications NodeJS peuvent-elles être distribuées en binaire? c'est à dire. vous compilez l'application .js via V8 dans son binaire natif et distribuez le binaire aux clients? (si vous aviez un accès total au serveur NodeJS) ... ou est-ce que vous réduisez le code tout ce que vous pouvez faire?

Pourquoi: Nous créons des applications côté serveur dans NodeJS pour les clients, qui doivent souvent être hébergées sur les serveurs du client. La distribution du code source signifie que les clients peuvent facilement voler notre solution et cesser de payer les frais de licence. Cela ouvre la possibilité d'une rétro-ingénierie facile ou d'une réutilisation de nos applications à notre insu.

61
Robinicks

Oui, vous pouvez créer un format binaire. La V8 vous permet de précompiler JavaScript. Notez que cela pourrait avoir un tas d'effets secondaires étranges sur les hypothèses faites par le noyau du nœud.

La distribution du code source signifie que les clients peuvent facilement voler notre solution et cesser de payer les frais de licence.

Ce n'est pas parce que vous distribuez le binaire que vous vous protégez contre le vol. Ils peuvent toujours voler le code binaire ou le démonter. C'est une protection par l'obscurité qui n'est pas du tout une protection.

Il est préférable de leur donner une application client légère qui parle à votre serveur et de sécuriser le code de votre serveur en ne le donnant pas.

22
Raynos

Oui, c'est possible, utilisez ceci branche (basé sur 0.8.18) et tout code js que vous mettez dans 'deps/v8/src/extra-snapshot.js' sera compilé à l'avance au code machine et intégré dans la v8 dans le cadre de l'initialisation normale de l'objet intégré. Vous devrez créer des nœuds pour chaque plate-forme que vous prévoyez de déployer votre produit.

Le code instantané s'exécute très tôt dans l'initialisation de la v8 et vous ne pouvez pas accéder aux objets intégrés dans le "corps du module". Ce que vous pouvez faire est de mettre tout votre code dans une fonction d'initialisation globale à appeler ultérieurement. Ex:

// '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
};

En outre, cela suppose que votre code entier est défini dans un seul fichier, donc si votre projet utilise le système de modules nodejs (requis), vous devez écrire un script qui combinera tous vos fichiers en un et envelopper chaque fichier dans une fermeture qui trompera votre code en pensant qu'il s'agit d'un module nodejs normal. Chaque fermeture de module exposerait probablement une fonction require, et cette fonction devrait décider quand déléguer au standard 'global.require' ou renvoyer les exportations de vos autres modules intégrés. Voyez comment les systèmes de modules javascript sont implémentés pour les idées (requirejs est un bon exemple).

Cela rendra votre code plus difficile à déboguer car vous ne verrez pas les traces de pile pour le code natif.

MISE À JOUR:

Même en utilisant des instantanés v8, le code est intégré dans le binaire node.js car v8 préfère la compilation paresseuse. Voir this pour plus d'informations.

23
Thiago de Arruda

EncloseJS .

Vous obtenez un binaire entièrement fonctionnel sans sources.

Le code JavaScript est transformé en code natif au moment de la compilation à l'aide du compilateur interne V8. Par conséquent, vos sources ne sont pas requises pour exécuter le binaire et elles ne sont pas packagées.

Un code natif parfaitement optimisé ne peut être généré qu'au moment de l'exécution en fonction de la machine du client. Sans ces informations, EncloseJS ne peut générer que du code "non optimisé". Il fonctionne environ 2 fois plus lentement que NodeJS.

En outre, le code d'exécution node.js est placé à l'intérieur de l'exécutable (avec votre code) pour prendre en charge l'API de nœud pour votre application au moment de l'exécution.

Cas d'utilisation:

  • Faites une version commerciale de votre application sans sources.
  • Faites une version de démonstration/d'évaluation/d'essai de votre application sans sources.
  • Créez une sorte d'archive auto-extractible ou un programme d'installation.
  • Créez une application GUI en source fermée en utilisant la poussée du nœud.
  • Pas besoin d'installer node et npm pour déployer l'application compilée.
  • Pas besoin de télécharger des centaines de fichiers via npm install pour déployer votre application. Déployez-le comme un seul fichier indépendant.
  • Mettez vos ressources à l'intérieur de l'exécutable pour le rendre encore plus portable. Testez votre application par rapport à la nouvelle version du nœud sans l'installer.
8
Robinicks

J'étudie actuellement la même chose et je regarde nexe qui prétend pouvoir "créer un seul exécutable à partir de vos applications node.js".

Je ne peux pas vous dire si c'est bon pour l'instant, mais j'ai pensé que ça valait déjà la peine d'être partagé.

3
kvz

V8 génère du code machine natif en interne et l'exécute. Regardez ici: https://github.com/v8/v8-git-mirror/blob/master/src/compiler.cc#L1178 . Cette fonctionnalité est utilisée dans EncloseJS . EncloseJS analyse les sources de votre projet node.js, regroupe les dépendances et crée un binaire exécutable. Les sources ne sont pas incluses dans le code machine compilé uniquement binaire.

2
Igor Klopov

Nous avons utilisé pkg pour créer des versions binaires de notre application Node.js avant la distribution.

https://github.com/zeit/pkg

Afin d'ajouter la vérification des clés de licence, nous utilisons Cryptlex :

https://docs.cryptlex.com/node-locked-licenses/using-lexactivator/using-lexactivator-with-node.js

0
adnan kamili