我正在研究从Java调用Groovy脚本进行某些计算的可能性。由于这些计算可由任何人使用,因此脚本的语法必须受到限制。因此,我想限制对System类的任何方法或其他有害方法的调用,例如System.exit(0)。 我正在使用带有以下设置的带有SecureASTCustimizer的CompilerConfiguration。
CompilerConfiguration conf = new CompilerConfiguration();
SecureASTCustomizer customizer = new SecureASTCustomizer();
customizer.setClosuresAllowed(true);
customizer.setMethodDefinitionAllowed(false);
customizer.setPackageAllowed(false);
customizer.setIndirectImportCheckEnabled(true);
customizer.setReceiversWhiteList(Arrays.asList("java.lang.Object","java.lang.Math", "org.codehaus.groovy.runtime.InvokerHelper"));
customizer.setImportsWhitelist(Arrays.asList("java.lang.Math","classWithinScript","java.lang.Object", "org.codehaus.groovy.runtime.InvokerHelper"));
conf.addCompilationCustomizers(customizer);
常规脚本如下:
// For table definitions
class classWithinScript{
String TestName;
int value;
}
System.exit(0)
//Some calcualtions are done here
这非常有效,如果现在有人输入System.exit(0)
,则执行被阻止。
但是当我将类更改为:
class classWithinScript{
String TestName;
int value;
def any = System.exit(0)
}
//Some calculations
应用程序终止。
如何以这种方式阻止对System.exit()
的调用?