安全分发NodeJS应用程序

什么: NodeJS应用程序可以分布为二进制? 即。 你通过V8编译.js应用程序到它的本地二进制文件,并将二进制文件分发给客户端? (如果你有访问NodeJS服务器的权限),或者正在缩小代码,你可以做什么?

原因:我们在NodeJS中为客户端构build了服务器端应用程序,这些客户端往往要托pipe在客户端的服务器上。 分发源代码意味着客户可以轻易地窃取我们的解决scheme,并停止支付许可费用。 这样就可以在不知情的情况下轻松地对应用程序进行逆向工程或重用。

是的,你可以创build一个二进制格式。 V8允许您预编译JavaScript。 请注意,这可能会对节点核心的假设产生一系列奇怪的副作用。

分发源代码意味着客户可以轻易地窃取我们的解决scheme,并停止支付许可费用。

仅仅因为你发布二进制文件并不能保护你免遭盗窃。 他们仍然可以窃取二进制代码或反汇编它。 这是通过默默无闻的保护,完全没有保护。

最好给他们一个瘦客户端应用程序,与您的服务器通话,并保证您的服务器代码不会泄露。

是的,这是可能的,使用这个分支 (基于0.8.18),你放在'deps / v8 / src / extra-snapshot.js'的任何js代码都将提前编译成机器代码并embedded在v8作为正常的内build对象初始化的一部分。 您将需要为您打算部署产品的每个平台构buildnodejs。

快照代码在v8初始化中很早就运行,并且无法访问“模块体”中的内置对象。 你可以做的是把所有的代码放在一个全局的初始化函数中,以后再调用。 例如:

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

此外,这假定你的整个代码是在一个单一的文件中定义的,所以如果你的项目使用nodejs模块系统(require),你需要编写一个脚本,将所有的文件合并成一个封闭的文件,代码认为它是一个正常的nodejs模块。 可能每个模块闭包会暴露一个require函数,这个函数将不得不决定何时委托给标准的“​​global.require”或者从其他embedded式模块返回导出。 看看javascript模块系统是如何实现的想法(requirejs是一个很好的例子)。

这将使你的代码难以debugging,因为你不会看到本地代码的栈跟踪。

更新:

即使使用v8快照,代码也会embedded到node.js二进制文件中,因为v8更喜欢延迟编译。 看到这个更多的信息。

EncloseJS 。

你会得到一个没有源代码的function齐全

JavaScript代码在编译时使用V8内部编译器转换为本机代码。 因此,您的源代码不需要执行二进制文件,也不需要打包。

完全优化的本机代码只能在基于客户端机器的运行时生成。 没有这些信息EncloseJS只能生成“未优化”的代码。 它的运行速度比NodeJS慢大约2倍。

此外,node.js运行时代码放在可执行文件(以及您的代码)中,以在运行时为您的应用程序支持节点API。

用例:

  • 制作无应用程序的商业版本。
  • 无需资源即可制作应用的演示/评估/试用版本。
  • 制作一些自解压的存档或安装程序。
  • 使用节点推力创build一个封闭的源代码GUI应用程序。
  • 无需安装node和npm来部署编译的应用程序。
  • 无需通过npm install下载数百个文件来部署您的应用程序。 将其部署为一个独立的文件。
  • 将您的资产放在可执行文件中,使其更具可移植性。 testing您的应用程序对新的节点版本,而不安装它。

我目前正在调查同样的事情,并且正在寻找能够“从您的node.js应用程序中创build单个可执行文件”的nexe。

不能告诉你,如果它还没有好,但认为这是值得分享已经。

V8在内部生成本地机器代码并执行它。 看这里: https : //github.com/v8/v8-git-mirror/blob/master/src/compiler.cc#L1178 。 EncloseJS使用此function。 EncloseJSparsing你的node.js项目的源代码,捆绑依赖项,并生成一个可执行的二进制文件。 源代码不包含在仅用二进制编译的机器代码中。