2009-04-08 12 views
5

開発者がカスタムGroovyスクリプトとフリーマークテンプレートをアップロードできるようにするシステムを開発しています。サンドボックスJava/Groovy/Freemarkerコード - 特定のメソッドの実行を防ぐ

デフォルトのJavaセキュリティインフラストラクチャで、あるレベルのセキュリティを非常に高いレベルで提供できます。つまり、コードがファイルシステムやネットワークにアクセスできないようにすることができますが、特定のメソッドへのアクセスを制限する必要があります。

私の計画は、特定のメソッドをホワイトリストまたはブラックリストにするアノテーションを読み込むようにGroovyとFreemarkerのランタイムを変更することでしたが、コードのフォークバージョンを維持する必要がありました。

私が本質的に必要とするのは、GroovyまたはFreemarkerから呼び出されたときに特定のメソッドの実行を妨げることだけです。私はコールスタックを見るハックを考えましたが、これは大量のスピードヒットになります(それはかなり乱雑です)。

誰でもこれを実装するための他のアイデアはありますか?

答えて

5

これは、GroovyClassLoaderをサブクラス化し、ASTビジター内で制約を適用することで実行できます。このポストは、それを行う方法を説明しています:http://hamletdarcy.blogspot.com/2009/01/groovy-compile-time-meta-magic.html

また、そこに参照されているコードはGroovy 1.6インストーラのsamplesフォルダにあります。

+1

多くの(ほとんどの)ケースでは、メソッドのクラスはコンパイル時に認識されないため、ASTの解析は実際には機能しません。それでも、これが最善の答えですので、私はこれに目を向けるでしょう。 メタクラスを使用してまともなソリューションを見つけるのをやめました。 –

2

OSGiはこれに最適です。コードをバンドルに分割し、各バンドルが公開する内容と他のバンドルを正確に設定することができます。それはあなたのために働くだろうか?

+0

これにより、コードで特定のメソッドを呼び出さないように制限できますか? –

+0

コンセプトはバンドルのようなものです。そのバンドルの外にメソッドやものを制限することができます。 –

+0

厳密に言えば、あるクラスのメソッドを呼び出すことを制限することはできませんが、より多くのメソッドを持つ基本クラスと子クラスを作成し、より限定的な基本クラスにのみアクセスできます。 –

3

kohsukeのプロジェクトgroovy-sandboxをご覧ください。このトピックに関する彼のblog post hereも見てください。解決策は何ですか?サンドボックスですが、パフォーマンスの問題があります。

関連する問題