我正在通过模块导出JS模块。呼叫者功能需要此模块并调用导出的函数。
代码看起来喜欢以下内容:
file1.js
module.exports = {
Info: showInfo
}
function showInfo(param1, callback) {
callback(null, getInfo(param1))
}
let secretCode = 'xyz';
function getInfo(p1) {
return EncodeInfo(param1, secretCode);
}
function EncodeInfo(p2, p3) {
//some code
}
file2.js
var f1 = require('./file1');
f1.Info("some value");
现在是客户在运行时提供file2.js,而代码将部署到服务器。服务器入口点功能在file2.js中调用条目函数。file2.js只是可以访问核心节点库,日志记录功能和请求模块。
我需要隐藏file1.js中写的内容。客户可以做类似的事情以查看代码
console.log(f1.Info.toString());
//this will print following
/*
function showInfo(param1, callback){
callback(null, getInfo(param1))
}
*/
这是可以的,因为getInfo()
代码被隐藏了。另外,隐藏了其他私人功能和变量。还提到客户不能安装任何其他节点模块,而仅提供file2.js
请注意,我无法控制他在file2.js中写的内容,在将file2.js与其余代码合并之前,我都无法扫描。
问题1:问题仅仅是我的假设正确吗?还是有什么办法可以看到代码的其余部分或任何其他导入(要求(模块的细节?也许是通过原型?
问题2:有什么办法可以看到服务器入口点功能实现的详细信息。客户确实可以访问流程,因此可以访问proces.env,但这还可以。我对其他文件的代码更加困扰。
是的,file2
无法访问file1
的secretVariable
是正确的,它可以通过闭合足够完善。
file2由客户在运行时提供,代码将部署到服务器
然后你迷路了。不仅可以在服务器上运行不受信任的代码!代码使用var f1 = fs.readFileSync('./file1');
而不是require('./file1')
,公开您的代码及其"秘密"变量是微不足道的。可能还有多种其他方式。
如果要运行不信任的代码,则需要使用适当的沙盒解决方案。