2017-10-10 7 views
0

他の人が自分のプラグインのjarをアップロードできるシンプルなプラグインシステムを作成しましたが、プラグインシステムはそれをロードしてコードを実行します。私はどのようにjarをJavaで新しいスレッドを作成することを禁じることができますか?

ロードされたプラグインロジックを実行するために、プラグインシステムはサブクラスFunction<Input, Output>を取得しますが、その機能が新しいスレッドを作成したり、System.exitのような危険な動作をしないようにします。この行動をどうやって禁止することができますか?

私はAccessControllerまたはSecurityManagerをJavaで見つけました。私の意図を実装するためにどのように使用するのですか?

答えて

4

あなたが言ったように、セキュリティマネージャを追加できます。次のようなものがあります:try catchにコードを置き、カスタムセキュリティ例外をスローします。以下のコードはループで実行され、System.exit(1)を呼び出す。

import java.security.Permission; 

public class TestPreventSystemExit { 

    public static void main(String[] args) { 
     forbidSystemExitCall(); 
     while (true) { 
      try { 
       System.exit(1); 
      } catch (Exception ex) { 

      } 
     } 
    } 

    private static class PreventExitException extends SecurityException { 
    } 

    private static void forbidSystemExitCall() { 
     final SecurityManager securityManager = new SecurityManager() { 
      public void checkPermission(Permission permission) { 
       if (permission.getName().indexOf("exitVM") >= 0) { 
        System.out.println("Why you did this to me? :)"); 
        throw new PreventExitException(); 
       } 
      } 
     }; 
     System.setSecurityManager(securityManager); 
    } 

} 
1

System.exit()については、他の回答を参照してください。

スレッドの開始を防止するため:可能ですが、SecurityManagerクラスを拡張する必要があります。hereを参照してください。

AccessControllerについてはクライアントは、潜在的にチェックされるコードを書く方法の詳細です。 JVMの「所有者」が利用できるように、あなたのものではありません(here参照)。だからあなたの問題には役立ちません。

+1

あなたがリンクした答えは、スレッドが開始されないようにSecurityManagerを使用する方法を説明しているので、どうやってそれが不可能であると結論付けることができないのか分かりません。その答えを得るには、「java.lang.SecurityManagerをサブクラス化し、getThreadGroupメソッドをオーバーライドしてルートThreadGroupを返すことです。これにより、Javaがあるかどうかに基づいてスレッドがコードを作成できるかどうかを制御できます。 lang.RuntimePermission "modifyThreadGroup"。 " –

+0

私の回答を更新してくれてありがとうございました.-) – GhostCat

+0

@GhostCat FGITW hmmm? – Gab

関連する問題