2011-11-07 13 views
11

मैं यह देखने के लिए जांच कर रहा था कि node.js एप्लिकेशन बंद स्रोत वितरित करना संभव है या नहीं। क्लाइंट-साइड जावास्क्रिप्ट फाइल नहीं बल्कि सर्वर-साइड फाइलें व्यावसायिक उत्पाद के रूप में हैं। मुझे लगता है कि कोड obfuscation/uglification वास्तविक गोपनीयता प्रदान नहीं करेगा। शायद बाइनरी में स्रोत कोड पैकेजिंग/संकलन की तरह कुछ मदद कर सकता है। क्या यह संभव है?node.js कोड सुरक्षा

+2

node.js v8 के साथ कठिन है। इसका मतलब है कि आपको रन-टाइम पर अपने स्रोत कोड की व्याख्या करने के लिए v8 का उपयोग करने की आवश्यकता है। मुझे नहीं लगता कि बंद स्रोत करना संभव है। – Raynos

+0

रेनोस सही है, और इसके अलावा संकलन ओवरहेड की वजह से एप्लिकेशन को धीमा कर देगा। – alessioalex

+0

हां, देखो [यहां] (http://stackoverflow.com/a/12640211/304141) अपने कोड को प्रीकंपाइल करने के लिए। –

उत्तर

5

मैंने कुछ नोडजेएस और वी 8 कोड के आसपास खोज किया।

NodeJS भंडार पर सबसे पहले मैंने पाया जहां स्रोत कोड पहले src/node.cc पर क्रियान्वित करने भरी हुई है, लाइन 1128:

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

कौन सा पहली स्ट्रिंग, संकलित (और बाद में कार्यान्वित) का उपयोग कर:

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

deps/v8// v8.h, लाइन 639, संकलित समारोह रिटर्न शामिल पर v8 स्रोत कोड पर एक नज़र ले रहा है:

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

मुझे यकीन नहीं है कि लिपि संदर्भ के लिए क्या बाध्य है, लेकिन मैं तर्क दूंगा कि यह केवल एक बाइनरी ऑब्जेक्ट नहीं है जिसे आप पूरे संदर्भ को स्थानांतरित किए बिना किसी अन्य मशीन को सहेज सकते हैं और स्थानांतरित कर सकते हैं।

संपादित करें: v8.h पर गहराई से देखो, एक स्क्रिप्टडाटा वर्ग भी है, जो संकलन को तेज़ बनाने के लिए एक स्क्रिप्ट को पूर्व-संकलित करता है, और इसका उपयोग स्क्रिप्ट क्लास के साथ किया जा सकता है, लेकिन स्क्रिप्ट क्लास को अभी भी आवश्यकता है स्क्रिप्ट लोड करते समय मूल स्रोत। (शायद प्रिंटिंग त्रुटियों के लिए, यह जानता है कि त्रुटि मूल कहां है।)

संक्षेप में, मुझे नहीं लगता कि यह बहुत अधिक काम किए बिना संभव है।

2

एक अच्छी विधि है जिसे आप कोशिश कर सकते हैं - नोडजेएस स्रोत कोड को पुन: संकलित करें।

ओपन NodeJS src फ़ोल्डर (nodejs-v0.xxx/lib/module.js), तो आप इस मिलेगा:

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

अपनी आवश्यकताओं सूट करने के लिए नया एक्सटेंशन जोड़ें। उदाहरण के लिए:

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

फिर NodeJS पुनः संकलित करें, और अपने कोड को एन्क्रिप्ट और xxx.js से अपने कोड फाइल एक्सटेंशन का नाम बदलने xxx.jse करने के लिए।

2

वी 8 जावास्क्रिप्ट को आंतरिक रूप से संकलित करने और इसे निष्पादित करने के लिए जाना जाता है। EncloseJS node.js प्रोजेक्ट से संकलित निष्पादन योग्य बनाने के लिए इस सुविधा का उपयोग करता है। EncloseJS नोड/io.js के लिए एक कंपाइलर है - यह आपको क्लासिक कंपाइलर के समान गोपनीयता देता है।

+0

आप अपने उत्तर में अस्वीकरण जोड़ना चाहेंगे, क्योंकि आप EncloseJS के लेखक हैं। फिर भी, दिलचस्प समाधान। – svimre