gpt4 book ai didi

javascript - 如何在 node.js 中安全地运行用户提交的模块?

转载 作者:搜寻专家 更新时间:2023-10-31 23:49:18 24 4
gpt4 key购买 nike

我们计划在node.js + express上开发一个面向业务的应用平台。而且我们喜欢允许用户运行他们自己的本地 node.js 模块(文件集 js、css、html),所以通常它应该像门户和 portles/servlets。用户应该能够通过客户端在服务器端安装模块,这些模块应该与平台交互,其他模块会抛出一些 api。因此需要将这些模块与对系统文件和数据库的直接访问隔离开来,但它们应该可以访问自己的文件和数据库。请帮助我我们应该挖掘什么方向才能使其安全。我查看了以下信息:vm 中的沙箱和子进程。

我试过:

// Main file:
var util = require('util'),
vm = require('vm'),
fs = require('fs'),
sandbox = {
animal: 'cat',
count: 2,
require: require // I pass it to make possible for the module to
// include some additional files
// but it opens access for all system files
};
var context = vm.createContext(sandbox);

fs.readFile('./user_modules/index.js', 'utf8', function (err, data) {
vm.runInNewContext(data, context);
console.log(util.inspect(context));
});


//** User Module
// user_modules/index.js

var fs = require('fs');
count++;
animal = 'Dog';

fs.readFile('README.md', 'utf8', function (err, data) {
animal = 'Fox';
});

我将 REQUIRE 对象传递给模块以包含一些额外的文件,但它打开了对所有系统文件的访问权限,是否可以告诉 VM 或子进程仅使用特定文件夹?目前我不知道如何使用数据库,但我认为当用户安装他的模块时,平台应该复制所有文件并为用户创建一个数据库方案,然后当模块启动时我只需要传递连接到用户的对象数据库方案。

请帮助我,我是 Node 的新手,有什么解决我的问题的建议吗?

提前致谢

最佳答案

您可以做的一件事是围绕 require 创建一个 shim 函数,它可以执行您想要的任何验证,然后调用系统的 require 函数。然后,您可以将其作为“require”的替代品传递到沙箱中。

我不确定为 node.js 创建“安全”沙箱所需的所有更改。在某种程度上,这将取决于用户提交的模块需要做什么。

帮助确保用户模块不会干扰您的代码的一种方法是在它们自己的进程中运行它们。在 unix 系统上,您可以使用 chroot 创建一个隔离的文件系统供进程在其中运行,然后通过 stdio 管道或套接字与进程通信。

关于javascript - 如何在 node.js 中安全地运行用户提交的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15769704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com