我做了一些研究,找不到任何让我的案子成功的事情。
所以,我正在使用.js
从外部脚本加载require(..)
,每个脚本都会导出一个函数。
main.js
var main=10;
var mod1 = require("./mod1.js");
mod1.js
module.exports=function(){
console.log('loaded');
var net=require('net'); // i don't want it to be able to require certain node.js apis
net.create...;
}
我看到了一些.json
文件声明permissions
的方法,如果是这样,它会授予对脚本的访问权限。如何为核心node.js apis实现类似的东西?
答案 0 :(得分:8)
根据您的具体需求,您可以使用vm
模块(内置于Node)作为一种沙箱内容:
var vm = require('vm');
var fs = require('fs');
var safe_require = function(mod) {
var code = fs.readFileSync(require.resolve(mod));
var sandbox = {
console : console,
module : {},
require : function(mod) {
// as a simple example, we'll block any requiring of the 'net' module, but
// you could implement some sort of whitelisting/blacklisting for modules
// that are/aren't allowed to be loaded from your module:
if (mod === 'net') {
throw Error('not allowed');
}
// if the module is okay to load, load it:
return require.apply(this, arguments);
}
};
vm.runInNewContext(code, sandbox, __filename);
return sandbox.module.exports;
};
var mod = safe_require('./mod1');
(正如您所看到的,您希望在console
模块中使用的任何Node的内置函数,如safe_require
,需要在沙箱对象中传递)