安全分发NodeJS应用程序

时间:2012-02-23 12:31:41

标签: javascript security node.js deployment obfuscation

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

为什么:我们在NodeJS中为客户端构建服务器端应用程序,这些应用程序通常托管在客户端的服务器上。分发源代码意味着客户可以轻松窃取我们的解决方案并停止支付许可费用。这开启了在我们不知情的情况下轻松进行逆向工程或重用我们的应用程序的可能性。

6 个答案:

答案 0 :(得分:23)

是的,可以使用这个branch(基于0.8.18),你在'deps / v8 / src / extra-snapshot.js'中输入的任何js代码都将被提前编译作为普通内置对象初始化的一部分,加工代码并嵌入到v8中。您需要为要部署产品的每个平台构建nodejs。

快照代码在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'或从其他嵌入模块返回导出。了解如何为想法实现javascript模块系统(requirejs就是一个很好的例子)。

这将使您的代码更难调试,因为您不会看到本机代码的堆栈跟踪。

更新:

即使使用v8快照,代码也会嵌入到node.js二进制文件中,因为v8更喜欢延迟编译。有关详细信息,请参阅this

答案 1 :(得分:21)

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

  

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

仅仅因为你分发二进制文件并不能再次保护你。他们仍然可以窃取二进制代码或反汇编代码。这是通过默默无闻的保护,这根本不是保护。

最好给他们一个瘦客户端应用程序,该应用程序与您的服务器通信并保持您的服务器代码安全,不要放弃它。

答案 2 :(得分:8)

EncloseJS

你得到一个没有来源的全功能二进制文件。

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

完全优化的本机代码只能在运行时根据客户端的机器生成。没有这些信息,EncloseJS只能生成"未经优化的"码。它比NodeJS慢大约2倍。

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

用例:

  • 制作没有来源的应用程序的商业版本。
  • 制作没有来源的应用的演示/评估/试用版。
  • 制作某种自解压存档或安装程序。
  • 使用node-thrust创建一个封闭的源GUI应用程序。
  • 无需安装node和npm来部署已编译的应用程序。
  • 无需通过npm install下载数百个文件来部署您的应用程序。将其部署为单个独立文件。
  • 将您的资源放入可执行文件中,使其更具可移植性。 针对新节点版本测试您的应用程序而不安装它。

答案 3 :(得分:3)

我正在调查同样的事情,我正在查看nexe声称能够“从您的node.js应用程序中创建单个可执行文件”。

不能告诉你它是否有任何好处,但认为它已经值得分享了。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

我们一直在使用pkg在分发之前创建Node.js应用的二进制版本。

https://github.com/zeit/pkg

为了添加许可证密钥检查,我们使用Cryptlex

https://docs.cryptlex.com/node-locked-licenses/using-lexactivator/using-lexactivator-with-node.js