- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个平台,用户可以在其中创建自己的“小部件”,小部件基本上是 js 片段(将来还会有 html 和 css)。
问题是即使用户不在网站上,它们也必须运行,所以基本上我的服务必须安排这些用户脚本不时运行。
我试图弄清楚哪种方式是“沙盒化”该脚本的最佳方式,我的第一个想法是在 Docker 中运行它自己的进程,所以假设用户设法以某种方式进入 shell 它将是一个虚拟机,希望他会被锁在里面。
我不是 Docker 专家,所以我什至不确定这是否有意义,无论如何这会产生另一个问题,即让数百名 docker 运行一个简单的 javascript 片段。
是否有任何“安全”的方式来做到这一点?也许在空范围内运行脚本并以某种方式删除对“require”方法的访问?
另一个要求是在超时时终止脚本。
编辑: - 找到这个相关的 stackexchange link
最佳答案
这可以通过 docker 来完成,您可以创建一个包含脚本的 docker 镜像,然后运行该镜像,该镜像会创建一个容器供脚本在其中运行。
您甚至可以让它变得 super 简单,并基于官方 node.js docker 图像创建一个通用图像,并在运行时传入用户自定义文件,运行它们,保存输出,然后您就完成了。这种方法很好,因为只需要维护一个图像,而且设置简单。
传入数据的最佳方式是在容器上创建一个卷挂载,并且每次都将用户目录挂载到容器的同一位置。
例如,假设您的主机具有这样的目录结构。
/users/
aaron/
bob/
chris/
然后当您运行容器时,您只需要更改卷挂载。
docker run -v /users/aaron:/user/ myimagename/myimage
docker run -v /users/bob:/user/ myimagename/myimage
我不确定输出是什么,但您可以将其写入容器内的/user/output,输出将存储在用户输出目录中。
就超时而言,您可以编写一个简单的脚本来查看 docker ps,如果它运行的时间超过限制,docker 将停止容器。
因为一切都在容器中运行,所以您可以一次运行多个,并且它们彼此隔离,也与主机隔离。
关于linux - 将用户编写的在服务器上运行的 node.js 脚本沙盒化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36954894/
我是一名优秀的程序员,十分优秀!