2011-11-07 12 views
11

Stavo controllando per vedere se è possibile distribuire un'applicazione closed source node.js. Non i file Javascript lato client ma i file lato server come prodotti commerciali. Suppongo che l'offuscamento/l'offuscamento del codice non fornirà una vera privacy. Forse qualcosa come l'imballaggio/compilazione del codice sorgente in binario potrebbe aiutare. È possibile?node.js protezione codice

+2

node.js è associato a v8. Ciò significa che è necessario utilizzare v8 per interpretare il codice sorgente in fase di esecuzione. Non penso sia possibile fare closed source. – Raynos

+0

Raynos ha ragione, e inoltre rallenterebbe l'applicazione, a causa del sovraccarico di compilazione. – alessioalex

+0

Sì, guarda [qui] (http://stackoverflow.com/a/12640211/304141) per un modo per precompilare il tuo codice. –

risposta

5

Ho eseguito alcune ricerche attorno al codice NodeJS e v8.

In primo luogo sul repository NodeJS ho trovato in cui il codice sorgente viene caricato prima esecuzione su src/node.cc, linea 1128:

Local<Value> ExecuteString(Handle<String> source, Handle<Value> filename) 

Quale primo compila la stringa, (e poi esegue), utilizzando:

Local<v8::Script> script = v8::Script::Compile(source, filename); 

Dando uno sguardo al codice sorgente v8 alle dipendenze/V8/include/v8.h, la linea 639, la funzione ritorna di compilazione:

Compiled script object, bound to the context that was active 
    when this function was called. When run it will always use this 
    context. 

Non sono sicuro di quale sia lo script associato al contesto, ma direi che non è solo un oggetto binario che è possibile salvare e trasferire su un'altra macchina senza dover trasferire l'intero contesto.

MODIFICA: dando un'occhiata più approfondita a v8.h, c'è anche una classe ScriptData, che precompila uno script per rendere la compilazione più veloce e che può essere utilizzata con la classe Script, ma la classe Script richiede ancora la fonte originale quando si carica lo script. (Forse per quando si stampano errori, sa dove l'origine dell'errore.)

In sintesi, non penso sia possibile senza molto lavoro.

2

C'è un buon metodo che puoi provare - Ricompilare il codice sorgente NodeJS.

Aprire la cartella src nodejs (nodejs-v0.xxx/lib/module.js), si trova questo:

// Native extension for .js 
Module._extensions['.js'] = function(module, filename) { 
    var content = NativeModule.require('fs').readFileSync(filename, 'utf8'); 
    module._compile(stripBOM(content), filename); 
}; 

Aggiungi nuova estensione per la tua vacanza. Per esempio:

// Native extension for .jse (encrypted js) 
Module._extensions['.jse'] = function (module, filename) { 
    var content = stripBOM(NativeModule.require('fs').readFileSync(filename, 'utf8')).split('').reverse().join(''); 
    module._compile(content, filename); 
}; 

quindi ricompilare nodejs, e criptare il codice e rinominare il codice di estensione del file da xxx.js a xxx.jse.

2

V8 è noto per compilare JavaScript internamente ed eseguirlo. EncloseJS utilizza questa funzione per rendere un eseguibile compilato dal progetto node.js. EncloseJS è un compilatore per node/io.js - ti dà la stessa privacy del compilatore classico.

+0

È possibile aggiungere una dichiarazione di non responsabilità alla risposta, poiché si è l'autore di EncloseJS. Tuttavia, soluzione interessante. – svimre