javascript - 运行不安全 JavaScript 代码的最佳解决方案

标签 javascript v8

我有一个场景。用户能够运行用 JavaScript 编写的应用程序。他们完全不受控制。我不得允许任何方式与底层系统交互。我的第一个想法是使用类似 vm2 的东西来隔离代码。我的问题是 NodeJS 开销。理想情况下,我会以尽可能小的间隔运行它。

我曾考虑为 v8 JavaScript 引擎编写一个接口(interface),它可以获取并执行脚本,但是,这种方法会失去 NodeJS 中的 libuv 集成,而这对于我的系统的有效性至关重要。

我的问题:保证执行安全、性能损失最小,同时保留类似 NodeJS 的执行条件(即 IO 的异步特性和事件循环的结构)的最佳方法是什么?作为额外的好处,我需要重新定义 import/export 行为,而不需要命令行标志数组或 package.json选项。

我不介意 C++ 脚本,因此非常欢迎任何涉及此的建议。 非常感谢您的指点。

最佳答案

如果你想“保证”任何东西,那么你需要一层将选项限制在你不关心的有限空间内,而这一层会花费一些成本。一些想法:

  1. 在浏览器中,最好是在用户的浏览器中。浏览器定期运行不受限制的 JS,它们几乎可以做任何事情,并且已经生成了比您可以阻止 JS 接管机器其余部分更好的沙箱。

  2. 在严格限制的容器中,理想情况下每次都重新构建,没有持久文件存储和 extra measures用于内核隔离。我仍然不相信它,但有一些 Docker 镜像宣传不受信任的执行,所以也许吧。

  3. 虚拟机 - 更重,但隔离更可靠。

  4. vm2 或其他运行时层:通过限制语言本身,为人们留下更少的发挥聪明才智的空间。

  5. 编译层:通过解析器运行用户输入,解析器在白名单之外的任何命令/模块上都会失败。虽然有很多 JS 超集/转译器脚本/框架,但我不知道有这样的限制,并且由于混淆恶意代码的方法多种多样,因此不建议您自行开发。

安全性仍然是相对的:限制可能会阻止 JS 影响主机,同时仍然允许针对远程系统的 DDoS。

关于javascript - 运行不安全 JavaScript 代码的最佳解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68916446/

相关文章:

c++ - 解析字符串参数数组

parsing - 我如何访问 v8 解析树怎么做?

javascript - 单个对象的 Node.js 堆内存限制

javascript - 如何在没有 Immutable 的情况下在 React 中设置 Redux?

javascript - 由于 CORS,Hubspot API 无法正常工作

javascript - 具有多个 OR 的 IF 语句的替代方法

javascript - Node.js虚拟内存在使用子进程时不断增加

javascript - 在 http 请求上加载 Angular Spinner

javascript - Angular 8 在异步调用链之后返回可观察的

javascript - XMLHttpRequest 和 setInterval 的内存泄漏