我有一个场景。用户能够运行用 JavaScript 编写的应用程序。他们完全不受控制。我不得允许任何方式与底层系统交互。我的第一个想法是使用类似 vm2
的东西来隔离代码。我的问题是 NodeJS 开销。理想情况下,我会以尽可能小的间隔运行它。
我曾考虑为 v8 JavaScript 引擎编写一个接口(interface),它可以获取并执行脚本,但是,这种方法会失去 NodeJS 中的 libuv 集成,而这对于我的系统的有效性至关重要。
我的问题:保证执行安全、性能损失最小,同时保留类似 NodeJS 的执行条件(即 IO 的异步特性和事件循环的结构)的最佳方法是什么?作为额外的好处,我需要重新定义 import
/export
行为,而不需要命令行标志数组或 package.json
选项。
我不介意 C++ 脚本,因此非常欢迎任何涉及此的建议。 非常感谢您的指点。
最佳答案
如果你想“保证”任何东西,那么你需要一层将选项限制在你不关心的有限空间内,而这一层会花费一些成本。一些想法:
在浏览器中,最好是在用户的浏览器中。浏览器定期运行不受限制的 JS,它们几乎可以做任何事情,并且已经生成了比您可以阻止 JS 接管机器其余部分更好的沙箱。
在严格限制的容器中,理想情况下每次都重新构建,没有持久文件存储和 extra measures用于内核隔离。我仍然不相信它,但有一些 Docker 镜像宣传不受信任的执行,所以也许吧。
虚拟机 - 更重,但隔离更可靠。
vm2 或其他运行时层:通过限制语言本身,为人们留下更少的发挥聪明才智的空间。
编译层:通过解析器运行用户输入,解析器在白名单之外的任何命令/模块上都会失败。虽然有很多 JS 超集/转译器脚本/框架,但我不知道有这样的限制,并且由于混淆恶意代码的方法多种多样,因此不建议您自行开发。
安全性仍然是相对的:限制可能会阻止 JS 影响主机,同时仍然允许针对远程系统的 DDoS。
关于javascript - 运行不安全 JavaScript 代码的最佳解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68916446/