2011-11-07 14 views
11

Sprawdzałem, czy możliwe jest rozpowszechnianie zamkniętego źródła aplikacji node.js. Nie pliki JavaScript po stronie klienta, ale pliki po stronie serwera jako produkt komercyjny. Przypuszczam, że kod zaciemniania/uciskania nie zapewni prawdziwej prywatności. Może coś w rodzaju pakowania/kompilowania kodu źródłowego do binarnego mogłoby pomóc. czy to możliwe?ochrona kodu node.js

+2

node.js jest mocno sprzężony z V8. Oznacza to, że musisz użyć v8, aby zinterpretować kod źródłowy w czasie wykonywania. Nie sądzę, że możliwe jest zamknięcie źródła. – Raynos

+0

Raynos ma rację, a poza tym spowolniłoby aplikację, ze względu na kompilację kosztów ogólnych. – alessioalex

+0

Tak, spójrz [tutaj] (http://stackoverflow.com/a/12640211/304141), aby uzyskać prekompilację kodu. –

Odpowiedz

5

Zrobiłem trochę wyszukiwania wokół kodu NodeJS i v8.

Pierwszy na NodeJS repozytorium znalazłem gdzie kod źródłowy jest najpierw ładowany wykonywany w src/node.cc, linia 1128:

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

który po raz pierwszy zestawia ciąg (i później wykonuje), używając:

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

Przyjrzeniu kodzie v8 w liczbą wykazywanych zależności/V8/to/v8.h, linia 639, funkcja zwraca opracowanie:

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

Nie jestem pewien, co oznacza skrypt związany z kontekstem, ale twierdzę, że nie jest to tylko obiekt binarny, który można zapisać i przenieść na inną maszynę bez konieczności przesyłania całego kontekstu.

EDYCJA: Przyjmując głębsze spojrzenie na v8.h, istnieje również klasa ScriptData, która wstępnie kompiluje skrypt, aby uczynić kompilację szybszą, i która może być używana z klasą Script, ale klasa Script nadal wymaga oryginalne źródło podczas ładowania skryptu. (Może za błędy w drukowaniu, wie, skąd pochodzi błąd.)

Podsumowując, nie sądzę, że jest to możliwe bez dużej pracy.

2

Istnieje dobra metoda, którą można wypróbować - Przekompiluj kod źródłowy NodeJS.

Otwórz folder nodejs src (nodejs-v0.xxx/lib/module.js) znajdziesz poniżej:

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

Dodaj nowe rozszerzenie do swoich potrzeb. Na przykład:

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

Następnie skompilować nodejs i zaszyfrować swój kod i zmienić swój kod rozszerzenie pliku z xxx.js do xxx.jse.

2

V8 jest znany ze skompilowania JavaScriptu wewnętrznie i wykonania go. EncloseJS używa tej funkcji, aby utworzyć skompilowany plik wykonywalny poza projektem node.js. EncloseJS to kompilator dla node/io.js - zapewnia to prywatność jak klasyczny kompilator.

+0

Możesz dodać zastrzeżenie do swojej odpowiedzi, ponieważ jesteś autorem EncloseJS. Niemniej ciekawe rozwiązanie. – svimre