0

署名されていない Java アプレットを Web ブラウザで実行すると、できることとできないことがあります。これを定義するファイルがどこかにあるはずです。おそらくここのリスト [ http://www.coderanch.com/t/460650/Websphere/java-security-AccessControlException-Access-denied ] のようになり、次のようなエントリが含まれると思います。

permission java.lang.RuntimePermission "getClassLoader"; 
permission java.lang.RuntimePermission "setFactory"; 
permission java.lang.RuntimePermission "accessClassInPackage.sun.misc"; 
permission java.lang.RuntimePermission "accessClassInPackage.sun.beans.infos"; 
permission java.lang.RuntimePermission "accessDeclaredMembers"; 
permission java.net.SocketPermission "*", "accept, resolve, connect"; 
permission java.util.PropertyPermission "*", "read, write"; 
permission java.security.SecurityPermission "printIdentity"; 
permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; 
permission java.lang.RuntimePermission "modifyThread"; 
permission java.lang.RuntimePermission "modifyThreadGroup"; 
permission java.security.SecurityPermission "getProperty.ssl.SocketFactory.provider"; 

permission java.lang.RuntimePermission "createClassLoader"; 
permission java.lang.RuntimePermission "getProtectionDomain"; 

含まれている可能性のあるその他のエントリのリストを次に示します: http://download.java.net/jdk8/docs/technotes/guides/security/permissions.html

以下は、制限事項を非公式にリストしたものです (複数のユーザーが試行錯誤して作成したようです):

このページ [ http://docs.oracle.com/javase/1.3/docs/guide/security/PolicyFiles.html ] は、関連するファイルが${java.home}\lib\security\java.policy${user.home}\.java.policy. 後者のファイルはなく、前者のみのデフォルトのインストールがあります。そのファイルには

permission java.lang.RuntimePermission "stopThread";

PropertyPermissionなどのさまざまな

permission java.util.PropertyPermission "java.version", "read";

これが、署名されていないアプレット用の追加のデフォルト ポリシー ファイルが必要であることを知る方法です。新しいスレッドを開始するアプレットを作成しました。java.policy上記のデフォルト ファイルでは、次のエラーで失敗します。java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")それは"modifyThreadGroup"許可です。ただし、ブラウザで実行すると、スレッドが正常に作成されます。

問題は、ブラウザでアプレットを実行するとき、このアクセス許可を含むポリシー ファイルはどこにあるの"modifyThreadGroup"かということです。JRE ディレクトリで検索しましたが、ないようです。多分それはファイルを通して行われません。では、何がアプレットに"modifyThreadGroup"パーミッション (およびその他) を付与するのでしょうか?

編集

私が見る例外のスタックトレースは次のとおりです。

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
    at java.security.AccessController.checkPermission(AccessController.java:555)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at sun.applet.AppletSecurity.checkAccess(AppletSecurity.java:252)
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
    at java.lang.Thread.init(Thread.java:376)
    at java.lang.Thread.<init>(Thread.java:446)
    at LITSApplet.init(LITSApplet.java:30)
    at sun.applet.AppletPanel.run(AppletPanel.java:434)
    at java.lang.Thread.run(Thread.java:722)
4

1 に答える 1

2

具体的にはmodifyThreadGroup

  • コンストラクターの API ドキュメントはコンストラクThreadターを指しますThread(ThreadGroup,Runnable,String)
  • Thread(ThreadGroup,Runnable,String)コンストラクターは、指定された上で参照しThreadGroup.checkAccessますThreadGroup
  • ThreadGroup.checkAccess呼び出すことが文書化されていますSecurityManager.checkAccess(ThreadGroup)
  • SecurityManager.checkAccess(ThreadGroup)API ドキュメントは、そのクラス内の実装について次のように述べています。

スレッド グループ引数がシステム スレッド グループでない場合、このメソッドは何も通知せずに戻ります。

(次に、LSP を壊すようなものを示唆しています。

より厳格なポリシーが必要なアプリケーションは、このメソッドをオーバーライドする必要があります。

)

通常の Java コードを介して追加のアクセス許可が追加されます。これは、Same Origin Policy について考える場合に必要です。

于 2012-11-23T12:40:53.040 に答える