代码之家  ›  专栏  ›  技术社区  ›  Jono Brogan

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

  •  1
  • Jono Brogan  · 技术社区  · 11 年前

    我目前正在评估一个项目的可行性,该项目旨在构建一个小型web应用程序,该应用程序提供类似于 tryruby codeacademy 我一直在寻找可能的解决方案来安全地评估用户提交的代码,关于服务器端的解决方案,我读到JVM提供了最好的沙箱环境 security measures .

    我读到关于 JavaTM Scripting API 并且它可以用于评估 various script engines/ interpreters 如rhino(javascript)、jruby、jython和Quercus(php)。有可能让一台服务器运行JVM来评估几种不同语言的用户代码吗?这会有效率吗?如果没有,我还有什么其他选择?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Stephen C    11 年前

    有可能让一台服务器运行JVM来评估几种不同语言的用户代码吗?

    是的,这是可行的。

    这会有效率吗?

    我不知道为什么效率是一个特别令人担忧的问题。让我印象深刻的是,为远程用户运行小示例并不需要效率。不管怎样,我认为应该 足够高效 .


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

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

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

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

    如果你实现了一个像你提议的那样的服务,你将需要一个策略来处理这些事情。


    后续行动

    关于效率的评论,我的想法是,将整个解释器加载到内存中,可能只加载一行代码,这可能不是最好的方法吗?

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

    但无论哪种方式,你最好把效率问题留待以后解决。