安全分发NodeJS应用程序

Rob*_*cks 61 javascript security deployment obfuscation node.js

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

原因:我们在NodeJS中为客户端构建服务器端应用程序,这些应用程序通常托管在客户端的服务器上.分发源代码意味着客户可以轻松窃取我们的解决方案并停止支付许可费用.这使我们无需了解即可轻松进行逆向工程或重复使用我们的应用程序.

Thi*_*uda 23

是的,有可能,使用这个分支(基于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
};
Run Code Online (Sandbox Code Playgroud)

此外,这假设您的整个代码都在一个文件中定义,因此如果您的项目使用nodejs模块系统(require),您需要编写一个脚本,将所有文件合并为一个,并将每个文件包装在一个闭包中,这将欺骗您代码认为它是一个普通的nodejs模块.可能每个模块闭包都会暴露一个require函数,这个函数必须决定何时委托标准'global.require'或从其他嵌入模块返回导出.了解如何为想法实现javascript模块系统(requirejs就是一个很好的例子).

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

更新:

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


Ray*_*nos 22

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

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

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

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

  • 有时客户是如此安全,以防止任何互联网访问.即,当您的业务逻辑必须位于客户端的服务器上时,存在用例.因此,保护​​node.js服务器代码的问题非常实际. (8认同)
  • 这些东西通常是一场失败的比赛.然而,你为另一方"保护这个"所吸引的许多资源将拥有更多的资源.您根本不必担心这一点,并确保您的业务不依赖于代码中的魔术酱,而是依赖于公司产生的实际非代码值. (7认同)
  • @James Andino:但是,即使您可以编译代码,是什么阻止某人获取可执行文件和数据文件并将其安装在另一台机器上?编译代码与锁定汽车不相似.编译是一种性能和包装措施,而不是安全措施. (5认同)
  • 同意@Dzenly.此外,"通过默默无闻的保护完全没有保护"是错误的.正如kumar_harsh指出的那样,它只是提高了标准,但仅仅因为标杆不是不可克服的并不意味着它不提供价值 - 否则你可以说任何安全系统都是如此.对于企业产品尤其如此.此外,需要高安全性的客户更有可能拥有强大的控制权,这使得员工难以对其供应商的产品进行逆向工程,这可能是一种可以起诉的攻击. (3认同)
  • 好吧,我对这种逻辑的唯一辩护就是辱骂。 (2认同)

Rob*_*cks 8

EncloseJS.

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

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

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

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

用例:

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

  • EncloseJS已弃用.它的继承者`pkg`是开源的,并在MIT许可下分发.https://github.com/zeit/pkg (4认同)
  • EncloseJS的许可证不允许商业用途. (3认同)

adn*_*ili 5

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

https://github.com/zeit/pkg

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

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