限制npm依赖项模块对require(isolation)的使用

有没有办法通过限制使用requirerequire一个npm模块?

例如,一个应用程序可以提供一个系统来扩展它的一些function,通过提供一个npm模块来完成一个给定的合同( 比如说它用一个方法process导出一个类 )。 该模块,如果知道require它的应用程序的源代码可能require('db').connect().flush()或类似的东西。

这个应用程序扩展可能require从它的主机的任何修改它。 npm是否允许限制/安全的方法来处理这种情况(可能通过使用进程)?

谢谢。

NPM不提供任何事情来完成这个任务,但根据您的要求,您可以通过覆盖节点的require语句来实现某种程度的安全性。

 const MY_SECRET_TOKEN = '1234'; const rekuire = global.require; global.require = function(nodeModule, token) { if (nodeModule !== 'db' || MY_SECRET_TOKEN === token) { return rekuire(nodeModule); } throw new Error('Unauthorized attempt to access secure module "db"!); }; 

一个恶意模块仍然可以解决这个问题。 实际上,你的重点应该是仔细审查你使用什么模块,我不会在上面使用prod。

Node.js和npm都不提供沙盒模块的工具。 尽pipe对于一个模块实际加载的知识有一点点的了解,但是我们可以很容易地实现这样的机制。

让我们来看看,一个模块如何访问require

一旦需求准备就绪,整个加载的源代码将被包装在一个新的函数中,该函数接受require,module,exports和所有其他暴露的variables作为参数。 这为该模块创build了一个新的function范围,这样就不会对Node.js环境的其他部分造成污染。

实际上,我们可以在源代码中看到确切的模板:

 NativeModule.wrapper = [ '(function (exports, require, module, __filename, __dirname) { ', '\n});' ]; 

所以我们可以利用相同的方法, 在需要之前将上传的模块封装在IIFE中:

 (function (exports, require, module, __filename, __dirname) { // module source }(exports, undefined /* here's the trick */, module, __filename, __dirname); 

现在我们可以安全地要求包装模块,因为它不再requirefunction。