【问题标题】:How to provide an online ruby REPL?如何提供在线 ruby​​ REPL?
【发布时间】:2017-02-03 06:40:53
【问题描述】:

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

这实际上是如何工作的?

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

【问题讨论】:

    标签: ruby security eval read-eval-print-loop irb


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多