2

ファイル システム、ネットワーク、またはその他の IO に、非常に制限された独自の API を介してアクセスすることを除いて、人々がサーバー上で単純なコンソール Java プログラムを実行できるようにしたいとします。しかし、オペレーティング システム レベルの制限に深く入り込みたくないので、現在の議論のために、コード レベルのサニタイズ方法を検討したいと思います。

したがって、次のようにこの制限を達成しようとするとします。明示的にホワイトリストに登録されているものを除いて、すべての "import" ステートメントを禁止します (たとえば、"import SanitizedSystemIO. " は許可されていますが、"import java.io. " は許可されていません)。したがって、ユーザーは SanitizedSystemIO の File クラスを参照するコードを記述できますが、java.io.File を参照することはできません。このようにして、ユーザーはサニタイズされたラッパー API を使用することを余儀なくされますが、独自のフレームワーク コード (IO 機能を提供するために、ユーザーのコードと一緒にコンパイルおよび実行される) はすべての通常の Java API にアクセスできます。

このアプローチは機能しますか? または、標準のJava APIにアクセスするためにハッキングする方法はありますか?

ETA: わかりました。まず第一に、これはもちろん system.* ではなく java.* 文字列でなければなりません。基本的にC#だと思います...

第二に、「セキュリティマネージャーを使用する」または「クラスローダーを使用する」というアプローチがあると人々は言います。しかし、コード分析アプローチのどこが悪いのでしょうか? KISS の利点の 1 つは、KISS の単純さです。SecurityManager でチェックしてサニタイズするすべてのものを把握する代わりに、機能の小さなホワイトリストを許可し、他のすべてをブロックするだけです。実装に関しては、これは Java の知識がほとんどない人にとっては些細な作業です。

元の質問を繰り返しますが、これはハッキングできますか? このようなコード制限にもかかわらず、基になる API へのアクセスを許可する Java 言語構造はありますか?

4

3 に答える 3

4

あなたの靴では、ロードされたアプリを custom 内で実行したいと思いますClassLoader

たぶん私は間違っているかもしれませんが、彼が自分の関数を介して IO への制限付きアクセスを許可したい場合は、SecurityManagerそれらも防止しないでしょうか? カスタムを使用すると、人々にロードしてほしくないものをロードすることを拒否しながらClassLoader、彼は自分のものを提供できます。SanitizedSystemIO

ただし、コード内の文字列をチェックすることは、間違いなく適切な方法ではありません。

于 2012-04-09T16:50:59.023 に答える