70 votes

Sécuriser la distribution d'applications NodeJS

Quoi: Peut NodeJS apps être distribués en tant que binaire? c'est à dire. vous compilez le .js application via V8 dans sa binaire natif, et de distribuer des binaires à ses clients? (si vous avez un accès total au serveur NodeJS)... ou est-minifying le code tout ce que vous pouvez faire?

Pourquoi: Nous construisons serverside applications NodeJS pour les clients, qui ont souvent à être hébergés sur le client serveurs. La distribution de code source signifie que les clients peuvent facilement s'emparer de notre solution et de cesser de payer les frais de licence. Cela ouvre la possibilité de facile de la rétro-ingénierie ou la réutilisation de nos apps sans notre conscience.

27voto

Raynos Points 82706

Oui, vous pouvez créer un format binaire. V8 vous permet de pré-compilation JavaScript. Notez que cela peut avoir un tas d'étranges effets secondaires sur les hypothèses formulées par le nœud de base.

La distribution de code source signifie que les clients peuvent facilement s'emparer de notre solution et de cesser de payer les frais de licence.

Juste parce que vous distribuez le binaire ne vous protège pas againsts vol. Ils peuvent encore voler le code binaire ou de le démonter. C'est de la protection par l'obscurité qui n'est pas une protection à tous.

Il est préférable de leur donner un thin client app qui parle à votre serveur et de garder votre code serveur sécurisé par ne pas le donner.

26voto

Thiado de Arruda Points 1774

Oui c'est possible, l'utilisation de cette branche(basé sur 0.8.18) et tout code js que vous mettez dans 'deps/v8/src/extra-snapshot.js" seront en avance sur le temps compilé en code machine et intégrées dans des v8 dans le cadre de la normale builtin l'initialisation de l'objet. Vous aurez besoin de construire nodejs pour chaque plate-forme que vous souhaitez déployer votre produit.

Le snapshotted code s'exécute très tôt dans le v8 de l'initialisation et vous ne pouvez pas accéder builtin objets dans le module 'corps'. Ce que vous pouvez faire est de mettre tout votre code à l'intérieur d'un mondial de l'initialisation de la fonction qui doit être appelée plus tard. 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
};

Aussi, cela suppose que votre code est défini dans un fichier unique, donc si votre projet utilise des nodejs système de module(exiger), vous devez écrire un script qui va regrouper tous vos fichiers dans un seul et envelopper chaque fichier dans une fermeture qui va tromper votre code en pensant que c'est normal d'un module nodejs. Probablement chaque module de fermeture d'exposer un besoin de la fonction, et cette fonction aurait pour décider quand délégué à la norme mondiale.besoin d'un ou de retourner les exportations à partir de vos autres modules intégrés. Voir comment javascript module de mise en œuvre des systèmes pour des idées(requirejs est un bon exemple).

Cela permettra de rendre votre code plus difficile à déboguer depuis que vous avez l'habitude de voir des traces de pile pour le code natif.

Mise à JOUR:

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

3voto

kvz Points 745

Je suis en train d'étudier la même chose et je suis à la recherche à nexe, qui prétend être capable de "créer un exécutable unique de votre node.js apps".

Ne peux pas vous dire si c'est tout bon pour l'instant, mais pensé qu'il serait intéressant de partager déjà.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X