8

Method、、オブジェクトの呼び出しをField許可しないことでリフレクションセキュリティを実施するにはどうすればよいですか?SecurityPolicyファイルまたは他の何か?ConstructorsetAccessible(true)

通常、スタンドアロンJavaアプリケーションの場合、SecurityManager登録されていません。

これを使っていますSystem.setSecurityManager(new SecurityManager());

このアプローチは、メソッドを呼び出す場合に機能します。

jar全体を強制したい、またはjarを使用するクライアントコードが呼び出しを許可されていないsetAccessible(true);

より良いアプローチはありますか?

ありがとう。

4

1 に答える 1

5

ええと、それsetAccessibleのために働きます。見る:

class A {
  private String method1() {
    return "Hello World!";
  }
}

import java.lang.reflect.Method;

class B {
  public static void main(String[] args) throws Exception {
    System.setSecurityManager(new SecurityManager());
    Class clazz = A.class;
    Method m = clazz.getDeclaredMethod("method1");
    m.setAccessible(true);
  }
}

結果は

Exception in thread "main" java.security.AccessControlException: access denied ("java.lang.reflect.ReflectPermission" "suppressAccessChecks")
        at java.security.AccessControlContext.checkPermission(Unknown Source)
        at java.security.AccessController.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkPermission(Unknown Source)
        at java.lang.reflect.AccessibleObject.setAccessible(Unknown Source)
        at B.main(B.java:8)

うまくいかなかった理由の1つは、この投稿のコメントによると、Java 1.5では機能していなかったが、6以降では機能することです。


編集:特定のjarに対してそれを拒否するには、ポリシーファイルを使用する必要があります。例:

// specific file
grant codeBase "file:/test/path/tools.jar" {
  // no permissions for this one
};

// default to giving all
grant {
  permission java.security.AllPermission;
};

ポリシーファイルを指定するには、デフォルトへの追加として指定する方法と、指定されたもののみを指定する方法(source)の2つの方法があります。

使用する場合

java -Djava.security.manager -Djava.security.policy==someURL SomeApp

(doubleが等しいことに注意してください)次に、指定されたポリシーファイルのみが使用されます。セキュリティプロパティファイルに示されているものはすべて無視されます。

...または、それほど難しく見えないカスタムセキュリティマネージャを実装します。しかし、自分でそれをしたことはありません。

于 2013-02-01T10:53:08.193 に答える