沙箱Java/Groovy/Freemarker代码-防止执行特定方法

沙箱Java/Groovy/Freemarker代码-防止执行特定方法,java,security,groovy,sandbox,freemarker,Java,Security,Groovy,Sandbox,Freemarker,我正在开发一个系统,允许开发人员上传自定义groovy脚本和freemarker模板 我可以使用默认的Java安全基础设施在非常高的级别上提供某种级别的安全性,即防止代码访问文件系统或网络,但是我需要限制对特定方法的访问 我的计划是修改Groovy和Freemarker运行时,以读取注释,这些注释会将某些方法列入白名单或黑名单,但这将迫使我维护它们代码的分叉版本,这是不可取的 我基本上需要做的就是防止从Groovy或Freemarker调用特定方法时执行。我曾经考虑过一个可以查看调用堆栈的黑客,

我正在开发一个系统,允许开发人员上传自定义groovy脚本和freemarker模板

我可以使用默认的Java安全基础设施在非常高的级别上提供某种级别的安全性,即防止代码访问文件系统或网络,但是我需要限制对特定方法的访问

我的计划是修改Groovy和Freemarker运行时,以读取注释,这些注释会将某些方法列入白名单或黑名单,但这将迫使我维护它们代码的分叉版本,这是不可取的

我基本上需要做的就是防止从Groovy或Freemarker调用特定方法时执行。我曾经考虑过一个可以查看调用堆栈的黑客,但这将是一个巨大的速度损失(而且相当混乱)


有人对实现这一点有其他想法吗?

OSGi非常适合。您可以将代码划分为多个包,并精确设置每个包公开的内容以及其他包公开的内容。这对您有用吗?

您可以通过子类化GroovyClassLoader并在AST访问者中强制执行您的约束来实现。这篇文章解释了如何做到这一点:


另外,此处引用的代码位于Groovy 1.6安装程序的samples文件夹中

你应该看看kohsuke的项目。java的沙箱()是一个最近开发的库,它允许从java内部安全地执行不受信任的代码。
另请参见:

这是否允许我限制代码调用特定方法?其概念类似于捆绑。然后,您可以限制该捆绑包之外的方法和内容。严格来说,您不能限制类的某些方法被调用,但您可以使用更多方法创建基类和子类,并且只允许访问限制更严格的基类。在许多(大多数)情况下,方法所在的类在编译时是未知的,所以分析AST不会真正起作用。不过,这是最好的答案,所以我会勾选这个。我最终用元类找到了一个不错的解决方案。