我正在开发一个允许开发人员上传自定义groovy脚本和freemarker模板的系统。
我可以在默认的Java安全基础架构中提供一定级别的安全性 - 即阻止代码访问文件系统或网络,但是我需要限制对特定方法的访问。
我的计划是修改Groovy和Freemarker运行时以读取将某些方法列入白名单或将其列入黑名单的注释,但这会迫使我维护其代码的分叉版本,这是不可取的。
从Groovy或Freemarker调用时,我基本上需要做的就是阻止特定方法的执行。我已经考虑过一个可以查看调用堆栈的黑客,但这将是一个巨大的速度命中(并且它非常混乱)。
有没有人有任何其他想法来实现这个?
答案 0 :(得分:5)
您可以通过继承GroovyClassLoader并在AST访问者中强制执行约束来实现。这篇文章解释了如何做到这一点:http://hamletdarcy.blogspot.com/2009/01/groovy-compile-time-meta-magic.html
此外,引用的代码位于Groovy 1.6安装程序的samples文件夹中。
答案 1 :(得分:3)
您应该查看来自kohsuke的项目groovy-sandbox。还要看看他的blog post here关于这个主题以及解决方案正在解决的问题:沙盒,但性能有缺陷。
答案 2 :(得分:2)
OSGi非常适合这一点。您可以将代码分区为捆绑包,并准确设置每个捆绑包暴露的内容以及其他捆绑包。这对你有用吗?
答案 3 :(得分:1)
您可能还认为java-sandbox(http://blog.datenwerke.net/p/the-java-sandbox.html)是最近开发的库,允许从java中安全地执行不受信任的代码。
另见:http://blog.datenwerke.net/2013/06/sandboxing-groovy-with-java-sandbox.html