2011-11-07 49 views
11

Tôi đã kiểm tra xem liệu có thể phân phối một nguồn đóng ứng dụng node.js hay không. Không phải là các tệp Javascript phía máy khách nhưng các tệp phía máy chủ là một sản phẩm thương mại. Tôi cho rằng mã obfuscation/uglification sẽ không cung cấp sự riêng tư thực sự. Có lẽ một cái gì đó giống như đóng gói/biên dịch mã nguồn thành nhị phân có thể giúp đỡ. Điều này có thể không?bảo vệ mã node.js

+2

node.js được ghép nối với v8. Điều này có nghĩa là bạn cần sử dụng phiên bản 8 để giải thích mã nguồn của bạn tại thời gian chạy. Tôi không nghĩ rằng nó có thể làm nguồn đóng. – Raynos

+0

Raynos là đúng, và bên cạnh đó sẽ làm chậm ứng dụng, vì chi phí biên dịch. – alessioalex

+0

Có, hãy xem [đây] (http://stackoverflow.com/a/12640211/304141) để biết cách biên dịch trước mã của bạn. –

Trả lời

5

Tôi đã thực hiện một số tìm kiếm xung quanh mã NodeJS và v8.

lần thứ nhất về kho NodeJS tôi thấy nơi mã nguồn là lần đầu tiên nạp thực hiện trên src/node.cc, dòng 1128:

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

nào đầu tiên biên dịch chuỗi, (và sau đó thực hiện), sử dụng:

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

Lấy một cái nhìn tại các mã nguồn v8 tại DEPS/v8/include/v8.h, đường 639, hàm lợi nhuận Compile:

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

Tôi không chắc chắn kịch bản nào bị ràng buộc trong ngữ cảnh, nhưng tôi cho rằng nó không chỉ là một đối tượng nhị phân mà bạn có thể lưu và chuyển sang máy khác mà không phải chuyển toàn bộ ngữ cảnh.

EDIT: Xem sâu hơn v8.h, cũng có một lớp ScriptData, biên dịch trước một tập lệnh để biên dịch nhanh hơn và có thể được sử dụng với lớp Script, nhưng lớp Script vẫn yêu cầu nguồn gốc khi tải tập lệnh. (Có thể vì khi in lỗi, nó biết nguồn gốc lỗi ở đâu.)

Tóm lại, tôi không nghĩ rằng nó có thể thực hiện được nếu không có nhiều công việc.

2

Có một phương pháp hay mà bạn có thể thử - Biên dịch lại mã nguồn NodeJS.

Mở thư mục nodejs src (nodejs-v0.xxx/lib/module.js), bạn sẽ tìm thấy điều này:

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

Thêm phần mở rộng mới để phù hợp với nhu cầu của bạn. Ví dụ:

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

Sau đó biên dịch lại nodejs và mã hóa mã của bạn và đổi tên phần mở rộng tệp mã từ xxx.js thành xxx.jse.

2

V8 được biết là biên dịch JavaScript nội bộ và thực thi nó. EncloseJS sử dụng tính năng này để tạo một tệp thực thi được biên dịch từ dự án node.js. EncloseJS là trình biên dịch cho nút/io.js - nó mang đến cho bạn sự riêng tư giống như trình biên dịch cổ điển.

+0

Bạn có thể muốn thêm tuyên bố từ chối trách nhiệm cho câu trả lời của mình vì bạn là tác giả của cuốn sách EncloseJS. Tuy nhiên, giải pháp thú vị. – svimre

Các vấn đề liên quan