NodeJS 应用程序的安全分发

IT技术 javascript security node.js deployment obfuscation
2021-03-06 05:02:03

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

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

5个回答

是的,这是可能的,使用此分支(基于 0.8.18)并且您放入“deps/v8/src/extra-snapshot.js”中的任何 js 代码都将被提前编译为机器代码并嵌入到 v8 中作为正常内置对象初始化的一部分。您需要为要部署产品的每个平台构建 nodejs。

快照代码在 v8 初始化的早期运行,您无法访问“module主体”中的内置对象。您可以做的是将所有代码放在一个全局初始化函数中,以便稍后调用。前任:

// '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 module系统(需要),您需要编写一个脚本,将所有文件合并为一个并将每个文件包装在一个闭包中,这将欺骗您代码认为它是一个普通的 nodejs module。可能每个module闭包都会暴露一个 require 函数,这个函数必须决定何时委托给标准的“​​global.require”或从其他嵌入式module返回导出。看看 javascript module系统是如何为想法实现的(requirejs 就是一个很好的例子)。

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

更新:

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

谢谢,这非常有用,我必须尝试一下。
2021-05-12 05:02:03

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

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

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

最好给他们一个瘦客户端应用程序,它可以与您的服务器通信,并通过不泄露来确保您的服务器代码安全。

好吧,我对这种逻辑的唯一辩护是辱骂。
2021-04-17 05:02:03
这些东西通常是一场失败的比赛。无论您投入多少资源“确保这一点”,另一方都会拥有更多资源。您根本不应该担心这一点,并确保您的业务不依赖于代码中的神奇酱汁,而是依赖于您公司产生的实际非代码value。
2021-04-19 05:02:03
有时客户端是如此安全以防止任何互联网访问。即,当您的业务逻辑必须在客户端的服务器上时,有些用例。所以保护 node.js 服务器代码的问题是非常实际的。
2021-05-06 05:02:03
同意@Dzenly。此外,“无保护的隐匿保护”是错误的。正如 kumar_harsh 指出的那样,它只是提高了标准,但仅仅因为标准不是不可逾越的并不意味着它不提供value——否则你可以对任何安全系统说同样的话。对于企业产品尤其如此。此外,需要高安全性的客户更有可能拥有强大的控制措施,这使得员工很难对其供应商的产品进行逆向工程,这可能是一种可解雇的罪行。
2021-05-06 05:02:03
@James Andino:但是,即使您可以编译代码,是什么阻止某人获取可执行文件和数据文件并将它们安装在另一台机器上?编译代码并不类似于锁定汽车。编译是一种性能和打包措施,而不是一种安全措施。
2021-05-14 05:02:03

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

https://github.com/zeit/pkg

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

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

我目前正在调查同样的事情,我期待在nexe号称能够“创造一个单一的可执行文件从你的Node.js应用程序”的。

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

Nexe 允许创建独立的可执行文件,但根本不混淆代码。您可以轻松检索(巨大)二进制文件末尾的 javascript 代码。
2021-04-15 05:02:03

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

它只是懒惰编译的本机代码!(比他们说的优化的慢 2 倍)
2021-04-24 05:02:03