正在保护Node.js


Securing Node.js

PHP使限制用户在服务器上可以做的事情相对容易——只需通过PHP.ini disable_functions指令指示它禁用功能即可。Node.js中有类似的功能吗?在谷歌上搜索一些更明显的短语却变成了一片空白。我想人们可以通过控制requires子句中的内容来做类似的事情。然而,也许还有另一种方法呢?我非常感谢任何能够为我指明正确方向的人。


从评论来看,我需要澄清这个问题

  1. Context-我正在设置一个服务,允许用户在Docker容器中运行自己的Node代码。Docker容器相当安全,但正如Docker明确表示的那样,无法保证容器是一个没有任何溢出风险的沙盒
  2. 出于某种原因,我希望允许用户使用外部模块,这些模块的使用在他们的代码中使用标准的Node require("module name")语法声明

现在假设我让这种情况发生,并且用户坚持

require('shelljs/global');

轰。。。用户能够运行shell命令。那么我该如何阻止这种情况的发生呢?一种方法是扮演警察,严格控制用户可以通过这种方式接入哪些外部模块。另一个——因此也是我的问题——如果有一种php.ini风格的方法可以简单地阻止对某些功能的访问。根据我对Node工作方式的理解(目前还不完善),这是不可能的。然而,考虑到我是一个相对新手,我想我会在这里问一下,看看那些比我更了解Node的人会说些什么。

我不知道你的意思,但你可以控制你从模块导出中导出的内容。例如:

var DB = require("db");
var userFromDB = DB.find("username");
modules.exports = {
    publicUser: userFromDB.publicData
}

我们只公开了userFromDB.publicData,而不是整个userFromDB对象。公众中没有人可以访问其他任何内容。

防止一个攻击角度的一种方法是在运行node.js之前,将shell中的全局node_modules路径文件夹设置为与默认文件夹不同的文件夹。

然后,你可能会遇到一些实际需要全局模块的应用程序的问题,但你可以npm link它们或类似的应用程序。