代码之家  ›  专栏  ›  技术社区  ›  Patrick Lightbody

使用Java脚本(JRube、Jython、Groovy、BeeSek等)的安全性

  •  11
  • Patrick Lightbody  · 技术社区  · 15 年前

    我想运行一些未经验证的脚本(用尚未确定的语言编写,但需要是基于Java的,所以JRube、Groovy、Jython、BeeSek等都是候选)。我希望这些脚本能够做一些事情,并且限制做其他事情。

    通常,我只想使用Java的SuffigyMeal管理并完成它。这很简单,我可以限制文件和网络访问,关闭JVM的能力,等等,这对于我想要阻止的高级别的东西很好。

    但有些东西我想允许,但只有通过我提供的自定义API/库。例如,我不想允许直接网络访问打开到yahoo.com的urlconnection,但是如果用myurlconnection完成了,我就可以了。也就是说-有一组方法/类是我想要允许的,然后其他所有我想要的都是禁止的。

    我不相信这种安全性可以用标准的Java安全模型来完成,但也许可以。我对脚本语言本身的性能或灵活性没有特定的要求(脚本将是对我的API的简单过程调用,带有基本的循环/分支)。因此,即使是在每次反射调用上检查安全性检查的“大”开销,我也可以接受。

    建议?

    3 回复  |  直到 10 年前
        1
  •  4
  •   Jean Barmash    15 年前

    免责声明:我不是Java安全API的专家,所以可能有更好的方法来做这件事。

    我为工作 Alfresco 基于Java的开源企业CMS,我们实现了与您所描述的类似的东西。我们希望允许脚本编写,但只将Java API的子集暴露给脚本引擎。

    我们为JavaScript脚本选择了Rhino引擎。它允许您控制哪些API向JavaScript公开,这允许我们选择哪些类可用,哪些不可用。根据我们的工程师们的说法,开销在10%左右,还算不错。

    除此之外,这也可能与您有关,在Java方面,我们使用Acegi(现在Spring Security),并使用AOP对用户可以调用的方法提供基于角色的控制。这对于授权来说很有效。因此,实际上,用户首先通过javascript访问我们的应用程序,他首先可以使用一个受限制的API,然后根据授权进一步限制该API。因此,您可以使用AOP技术来进一步限制哪些方法可以被调用,从而允许在其他脚本语言(如Groovy等)中公开这一点。我们也在添加这些方法,相信我们的底层Java API保护用户免受未经授权的访问。

        2
  •  3
  •   Tom Hawtin - tackline    15 年前

    您可以使用一个自定义类加载器,它在委托给父类之前,对类进行审查链接。

    您可以创建自己的权限,检查安全敏感API中的权限,然后使用 AccessController.doPrivileged 在调用底层API时恢复适当的权限。

    您需要确保脚本引擎本身是安全的。《太阳里的犀牛》的JDK应该没问题,但不能保证。显然,您需要确保脚本的所有可用内容都是安全的。

        3
  •  0
  •   sulai    10 年前

    在groovy中,您可以完全按照您提到的做。其实很简单。您可以轻松地限制在受信任环境中运行的不受信任脚本的权限,允许使用您自己的API,而API又可以执行不受信任的操作。

    http://www.chrismoos.com/2010/03/24/groovy-scripts-and-jvm-security/