用于运行多种 JVM 平台语言的 Java 沙箱

Java sandbox for running multiple JVM platform languages

我目前正在评估构建一个小型 Web 应用程序的项目的可行性,该应用程序提供类似于 tryruby 和 codeacademy 的 REPL 编程环境,并且一直在寻找可能的解决方案来安全地评估用户提交的代码,关于服务器侧面解决方案 我读到 JVM 提供了最好的沙盒环境,因为它内置了安全措施。

我了解了 JavaTM Scripting API,它可用于评估各种脚本引擎/解释器上的代码,例如 rhino(javascript)、jruby、jython 和 Quercus(php)。是否有可能让单个服务器运行 JVM 来评估多种不同语言的用户代码?这会有效吗?如果没有,我还有什么其他选择?


Would it be possible to have a single server running the JVM to evaluate user code in serval different languages?

是的,这是可行的。

Would this be at all efficient?

我不确定为什么效率是一个特别关注的问题。让我印象深刻的是,为远程用户运行小示例并不需要效率。无论哪种方式,我的看法是它应该足够高效。

然而,真正令人担忧的是,这种服务会招致各种滥用:

  • 人们可能倾向于尝试破坏您的沙盒。如果您没有正确实施它(或者如果他们可以利用一些未修补的安全漏洞),他们可能会成功,并进入您系统的其余部分。

  • 人们可能倾向于发起拒绝服务攻击。有很多事情是安全沙箱无法处理的;例如创建大型数据结构以触发 GC 过载和 OOME,创建大量线程,无限循环。

  • 或者他们可能会不小心做了上述的一些事情。

如果您实现了与您提议的服务类似的服务,您将需要一种策略来处理这些事情。

跟进

Regarding the comment on efficiency, my thought was that loading an entire interpreter into memory for possibly a single line of code, may not be the best approach to take?

在基于 JVM 的语言上实现服务的正常方式是在同一个 JVM 实例中运行多个请求。如果你在这里这样做,你就不会每次都加载解释器。你只是在重新初始化它。

但不管怎样,你最好把效率问题留到以后。