Groovy脚本:如何防止可能的内存泄漏或无限循环

时间:2017-05-01 13:31:39

标签: groovy

我们打算允许我们的客户在我们的平台内执行他们自己的groovy脚本。他们将被允许只访问受控方法,但我们有一个问题。 虽然我们会在某个地方采取一切可能的措施,但我们可能会遇到长时间运行循环的风险 - 导致内存泄漏或无限循环,这可能会影响我们的平台。 在groovy脚本中是否有任何固有的方法来防止这种可能性?

1 个答案:

答案 0 :(得分:0)

您可以使用SecureASTCustomizer来阻止循环和所有危险的语法结构。

好文章here

如果您可以限制您的DSL(您的客户端可以运行的代码),以便它只能在您的对象上调用您的方法,那么您可以保证内存不会泄漏或被滥用。方式。

  1. 通过传递自定义GroovyShell
  2. 来构建您的CompilerConfiguration
  3. 使用方法CompilerConfiguration
  4. 使用自定义SecureASTCustomizer构建自定义addCompilationCustomizers(...)
  5. 您可能希望在DSL中获取所有函数调用以通过您的自定义类。为此,让shell解析脚本,将脚本强制转换为DelegatingScript并将其传递给您的对象:

    DemoDSLHelper delegate = new DemoDSLHelper(); // Your custom class with custom methods you want to expose in the DSL
    GroovyShell shell = new GroovyShell(createCompilerConfiguration());
    Script script = shell.parse(scriptText);
    ((DelegatingScript)script).setDelegate(delegate);
    Object result = script.run();
    
  6. 在单独的JVM中运行它,以便您可以使用与操作系统相关的原语(容器化等)对进程强制实施限制,或者只是在不遵守规则时将其终止(持续时间,资源)消费等)。如果它必须在执行其他操作的JVM中运行,那么至少您需要对DSL中接受的内容进行极其严格的限制。

  7. 并且here a gist有完整的可运行示例。