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.请注意,这可能会对节点核心所做的假设产生一系列奇怪的副作用.
分发源代码意味着客户可以轻松窃取我们的解决方案并停止支付许可费用.
仅仅因为你分发二进制文件并不能再次保护你.他们仍然可以窃取二进制代码或反汇编代码.这是通过默默无闻的保护,这根本不是保护.
最好给他们一个瘦客户端应用程序,与您的服务器通信,并保持您的服务器代码安全,不要放弃它.
你得到一个没有源的全功能二进制文件.
JavaScript代码在编译时使用V8内部编译器转换为本机代码.因此,您的源不需要执行二进制文件,也不会打包它们.
完全优化的本机代码只能在运行时根据客户端的机器生成.没有这些信息,EncloseJS只能生成"未经优化的"代码.它比NodeJS慢大约2倍.
此外,node.js运行时代码放在可执行文件中(与您的代码一起),以便在运行时为您的应用程序支持节点API.
用例:
在分发之前,我们一直使用 pkg 创建 Node.js 应用程序的二进制版本。
为了添加许可证密钥检查,我们使用Cryptlex:
https://docs.cryptlex.com/node-locked-licenses/using-lexactivator/using-lexactivator-with-node.js