2017-05-01 20 views
1

私たちのクライアントが私たちのプラットフォーム内で独自のGroovyスクリプトを実行できるようにするつもりです。彼らは制御された方法だけにアクセスすることが許されますが、我々は一つの懸念を持っています。 私たちは可能な限りどこかで注意を払いますが、長時間実行されるループの危険にさらされる可能性があります。その結果、メモリリークや無限ループがプラットフォームに影響する可能性があります。 groovyスクリプトには、このような確率を防ぐための固有の方法がありますか?Groovyスクリプト:可能なメモリリークや無限ループを防ぐ方法

+0

時間を置いてからスクリプトを強制終了してみませんか?ループ自体は有限であるかもしれませんが、今年または次は終了しません。 –

答えて

0

SecureASTCustomizerを使用すると、ループやすべての危険な構文を防ぐことができます。

ニース記事​​。

DSL(クライアントが実行できるコード)を制限してオブジェクト上のメソッドを呼び出すことができれば、メモリが漏洩したり濫用されたりすることはありません。

  1. あなたはおそらく、カスタムクラスを通過するためにあなたのDSL内のすべての関数呼び出しを取得したい方法addCompilationCustomizers(...)
  2. を使用してカスタムSecureASTCustomizerとカスタムCompilerConfigurationを構築し、それをカスタムCompilerConfiguration

  3. を渡すことによって、あなたのGroovyShellを構築あなたのもの。そのために、あなたのシェルスクリプトを解析してきた、DelegatingScriptとしてスクリプトをキャストし、あなたのオブジェクトを渡す:あなたはOSに依存してプロセスに制限を強制することができるように別のJVMで、

    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(); 
    
  4. ファイル名を指定して実行(コンテナ化など)のためのプリミティブを作成したり、ルール(期間、リソース消費など)を尊重しない場合は単純にそれを削除します。他のことをするJVM内で実行する必要がある場合は、DSLで受け入れる内容を極端に制限する必要があります。

およびhere a gist実行可能な完全な例。

+0

要点Huguesをありがとう。 SecureASTCustomizerは役に立ちます。記事も良いです。 –

関連する問題