如何在node.js javascript中限制对apis的访问?

时间:2013-10-18 07:03:30

标签: javascript node.js

我做了一些研究,找不到任何让我的案子成功的事情。

所以,我正在使用.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实现类似的东西?

1 个答案:

答案 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,需要在沙箱对象中传递)