Java脚本安全(JRuby,Jython,Groovy,BeanShell等)

我正在寻找运行一些未经validation的脚本(用一种尚未确定的语言编写,但需要基于Java,所以JRuby,Groovy,Jython,BeanShell等都是候选者)。 我希望这些脚本能够做一些事情并限制做其他事情。

通常,我只是使用Java的SecurityManager并完成它。 这非常简单,让我限制文件和网络访问,关闭JVM的能力等等。这对我想要阻止的高级别东西很有用。

但是我想要允许一些东西,但只能通过我提供的自定义API /库。 例如,我不想允许直接网络访问打开到yahoo.com的URLConnection,但如果使用MyURLConnection完成,我没关系。 那就是 – 我想要允许的一组方法/类,然后我想要的其他一切不受限制。

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

建议?

您可以使用自定义类加载器,在委托给父类之前,它会检测链接到类。

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

您需要确保脚本引擎本身是安全的。 Sun JDK中的Rhino版本应该没问题,但不能保证。 显然,您需要确保脚本可用的所有内容都是安全的。

在Groovy中,你可以完全按照你提到的那样做。 其实很简单。 您可以轻松限制在受信任环境中运行的不受信任脚本的权限,允许使用您自己的API,这反过来可以执行不受信任的事情。

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