如何提供在线 ruby REPL?

How to provide an online ruby REPL?

在像 www.codewars.com 这样的网站上,可以 运行 ruby 在一种沙箱中,几乎与 IRB 相同。

这实际上是如何工作的?

如果提交的代码是 eval()d,是什么阻止我提交 system("rm -rf *") 或重新定义基本功能,以便 50% 的时间 Array.sort 实际上 运行 s Array.shuffle?

最简单和最安全的解决方案是 运行 单独计算机上的 Ruby 代码,每次 运行 后擦除并重新安装。然而,这也是一个相当重量级的解决方案。

更轻量级,但(几乎)同样安全,将使用虚拟机或容器而不是整个单独的计算机,例如使用带有 ramfs 覆盖的只读文件系统,您在每 运行 之后卸载它。 (或者只是扔掉并重新创建容器。)

您还可以将 JRuby 与 JVM 的安全功能一起使用(或将 IronRuby 与 CLI 一起使用)。 JVM 为 JVM 程序提供了沙盒功能,毕竟 JRuby 和其他程序一样只是一个 Java 程序。

最后,您可以编写自己的 Ruby 考虑沙盒的实现,或者修改现有的实现。上面的三个选项相当简单,这个很难,因为大多数 Ruby 实现不是为沙盒设计的。例如TryRuby.Com就是这样工作的,为了Ruby1.9更新就花了很多时间,因为它最初是基于MRI的修改版,但MRI不支持Ruby 1.9。因此,实施必须切换到 YARV,并且必须从头开始重新实施许多使其沙盒安全的修改。 (上面的 JRuby/IronRuby 选项与此类似,但是您将实现沙箱安全的工作推给了其他人,例如 Oracle 或 Microsoft。)

一个不太安全但也很简单的解决方案是 运行 解释器在受限用户帐户下。

当然,您可以组合多种纵深防御方法,例如,运行在单独的 VM 上的受限用户帐户下安装沙盒解释器。

的工作是在运行ning 之前静态分析代码。讨厌的停机问题在这里困扰着我们。