一尘不染

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

java

我希望运行一些未经验证的脚本(以尚未确定的语言编写,但是需要基于Java,因此JRuby,Groovy,Jython,BeanShell等都是候选人)。我希望这些脚本能够执行某些操作,并限制执行其他操作。

通常,我只是去使用Java的SecurityManager并完成它。这非常简单,可以让我限制文件和网络访问,关闭JVM的能力等。这对于我想阻止的高级任务非常有用。

但是有些事情我想允许的,但只能通过我提供的自定义API
/库来实现。例如,我不想允许直接的网络访问来打开到yahoo.com的URLConnection,但是如果使用MyURLConnection完成,则可以。那就是-
我要允许一组方法/类,然后我要限制的所有其他事情。

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

有什么建议吗?


阅读 151

收藏
2020-12-03

共1个答案

一尘不染

免责声明:我不是Java安全API的专家,因此可能会有更好的方法来做到这一点。

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

我们选择Rhino
Engine进行JavaScript脚本编写。它允许您控制哪些API可以使用JavaScript,还可以选择哪些类可用,哪些不可用。根据我们的工程师,间接费用大约为10%-不错。

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

2020-12-03