- - PR -
Javaアプレット使用時のセキュリティに関して、お力をお貸しください。
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-02-08 14:48
今回使用するJavaアプレットはクライアントPC内のフォルダ・ファイルを読込みにいくのですが、
その段階で、java.security.AccessControlException が発生します。 これを回避するためには通常、ユーザーポリシーファイル(${user.home}/.java.policy)を編集し、 Javaアプレットに対して許可する権限と、そのアプレットのURLなどを指定します。 そこで、 http://msugai.fc2web.com/java/security/policy.html などを参考に、試してみましたが、うまくいきません。 WEBアプリケーションの構成と、試してみたポリシーファイルの設定を簡単に説明します。 /webapp/ ├ WEB-INF/ │ ├ src/ ・・・Javaソースを配置 │ ├ classes/ ・・・Javaクラスを配置 │ └ jsp/ ・・・ JSPファイルを配置 │ └ applet/ ・・・ アプレットを配置(applet.jar) 上記の構成のJavaサーブレット・アプリケーションを http://hogehoge.co.jp/ に配置し、 http://hogehoge.co.jp/webapp/ というURLでアクセスする状態です。 そこで、.java.policy には、 grant codeBase "http://hogehoge.co.jp/webapp/applet/-" { permission java.security.AllPermission; }; と記述してみましたが、やはりセキュリティエラーが発生します。 しかし、 codeBaseの指定を外し、 grant { permission java.security.AllPermission; }; としてみると、今度はエラーになりませんでした。 つまり、.java.policy自体は有効に働いているということです。 そこで、 grant codeBase "http://hogehoge.co.jp/webapp/-" { permission java.security.AllPermission; }; grant codeBase "http://hogehoge.co.jp/-" { permission java.security.AllPermission; }; など、少しずつ記述を変えて試しましたがどれもダメでした。 また、このアプレットをクライアントマシンの C:\直下に置いて、それを使用するようなHTMLを作成し、 grant codeBase "file:/C:/-" { permission java.security.AllPermission; }; grant codeBase "file://C:/-" { permission java.security.AllPermission; }; grant codeBase "file:///C:/-" { permission java.security.AllPermission; }; など、試しましたがどれもダメでした。 http://hogehoge.co.jp/webapp/ にあるアプレットにのみ一定の権限を認めるには Javaポリシーファイルをどのように設定すればよろしいでしょうか? |
|
投稿日時: 2006-02-08 21:59
>http://hogehoge.co.jp/webapp/ にあるアプレットにのみ一定の権限を認めるには
>Javaポリシーファイルをどのように設定すればよろしいでしょうか? #最近、どこまでを技術的理解の前提にすればいいか、よく分からない。 #java.policyの意味を理解しているのだろうか。 #最近は書いてあることをまんま鵜呑みにする奴が多くて「分かってる」のか「分かってない」 #のかが分からない。。 そもそも「Javaアプレット」について正確に理解していないようです。 なのでjava.policyなんぞ見ても無駄です。 それ以前に、おそらくHTMLファイルを良く分からずに適当に書いたかと思うので(推測) 「ちゃんと」記述しましょう。そっちのほうが重要です。 java.policyの「CodeBase」はその後です。 なぜなら、Java.policyの意味内容はあくまで「ある部分」を「許可する」 ですから。「ある部分」はjava.policyの前にすでに決まってるはずです。 CodeBaseではすでに決定してある(はず)の部分を記述します。 |
|
投稿日時: 2006-02-09 10:32
武澤です。
アプレット起動しているときに参照しているポリシーファイルが違うなんてことはないでしょうか? アプレットのJavaコンソールを見て、動作しているJavaのバージョンを確認して見てはどうでしょう? 参考までにJ2SDK1.4.2_0Xでアプレットが参照するポリシーファイルは以下の順になりますよ。 <user.home>¥.java.policy ←先頭にドットが入りますので注意 C:¥Program Files¥Java¥j2re1.4.2_X¥lib¥security¥java.policy |
|
投稿日時: 2006-02-09 10:33
返答ありがとうございます。
HTMLでは、 <APPLET CODEBASE="http://hogehoge.co.jp/webapp/applet/" CODE="com.xxxx.yyyy.MyApplet" archive="applet.jar" width="0" height="0" name="MyApplet"> </APPLET> と記述して正しく読込めています。 これがまずいのでしたらご指摘ください。 そして、codeBase 〜 の部分を削除すれば、問題なく動作します。 本当は permission に関して、ファイル読み取り権限をどのディレクトリに対して 許可する、とかこまごまと設定することは分かっています。 が、今回お尋ねしたいのは、 「なぜ、codeBase 〜 を指定すると、エラーになるのか?」 だけなのです。 動作検証の際に記述的なミスを減らすために 『permission java.security.AllPermission; 』 ということにしてお尋ねしています。 ですから、 「こういう配置」で「HTMLにこう記述」すれば、「codeBaseの指定」は こうなるはずで、○○○の部分がまずいから上手くいかないのでは? というアドバイスがいただきたいのです。 確かにきちんと理解できていない部分が多々あり、 答える側の皆様もやりにくいとは思いますが、何卒宜しくお願いいたします。 |
|
投稿日時: 2006-02-09 10:40
書き込みのタイミングが入れ違いになってしまいました。
>アプレット起動しているときに参照しているポリシーファイルが違うなんてことはな>いでしょうか? >アプレットのJavaコンソールを見て、動作しているJavaのバージョンを確認して見て>はどうでしょう? > >参考までにJ2SDK1.4.2_0Xでアプレットが参照するポリシーファイルは以下の順になり>ますよ。 ><user.home>¥.java.policy ←先頭にドットが入りますので注意 >C:¥Program Files¥Java¥j2re1.4.2_X¥lib¥security¥java.policy はい。 これはそれぞれのファイルを交互に編集して何度も確認しました。 その上で、現在は、<user.home>¥.java.policy の方を対象に、 codeBase指定の有り/無しで、上手く動いたりエラーになったりする、 その原因を探っている次第です。 |
|
投稿日時: 2006-02-09 10:45
私も<user.home>¥.java.policyを良く使っているのですが、
grant codeBase "http://hogehoge:80/webappname/hogehoge.jar" { permission java.security.AllPermission; }; というような書き方をしています。 または、jarを直接指定しない場合はアスタリスクで指定しています。 ハイフンは使ったことがないのでよく分かりません。 一度、直接jar指定、アスタリスク指定にしてみてはいかがでしょうか? |
|
投稿日時: 2006-02-09 20:30
返答ありがとうございます。
jarの直接指定も試してみましたが、やはりダメでした。 状況を分かりやすくするために、以下のようにして検証してみました。 (1)ローカルマシンのフォルダをダイアログで開くアプレットを 作成し、FolderSelectApplet.class として作成。 また、アプレットの初期化処理の部分で System.out.println(getCodeBase()); と記述。 (2)FolderSelectApplet.class を C:/ 直下に配置 (3)アプレットを起動するHTMLを作成し、その中に、 <APPLET CODEBASE="file:/C:/" CODE="FolderSelectApplet.class" width="0" height="0" name="FolderSelectApplet"> <param name="scriptable" value="true"> <param name="mayscript" value="true"> </APPLET> と記述。 (4)HTMLをブラウザ(IE6.0 SP2)で開き、アプレットの起動を確認。 ※getCodeBase() の出力結果は、「file:/C:/」 でした。 (5)まず、${user.home}/.java.policy に grant { permission java.security.AllPermission; }; と記述して、アプレットを動かしてみました。 問題なくローカルフォルダを開くことができました。 (※実際には AllPermission ではなく、もっと細やかな権限設定が必要なのですが、 まず、AllPermissionで上手くいかなければ、それより低位の権限はなおさら 無理だと考えられるためです。) ↓ ${user.home}/.java.policy への記述が有効であることを確認。 (6)次に、 grant { permission java.security.AllPermission; }; を grant codeBase "file:/C:/-" { permission java.security.AllPermission; }; と書き換えテストしてみました。 (7)AccessControlExceptionが発生。 コンソールへの出力は、 ----------------------------------------- java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPropertyAccess(Unknown Source) at java.lang.System.getProperty(Unknown Source) at java.io.Win32FileSystem.getUserPath(Unknown Source) at java.io.Win32FileSystem.resolve(Unknown Source) at java.io.File.getAbsolutePath(Unknown Source) at sun.awt.shell.Win32ShellFolder2.<init>(Unknown Source) at sun.awt.shell.Win32ShellFolder2.listFiles(Unknown Source) at sun.awt.shell.ShellFolder.listFiles(Unknown Source) at sun.awt.shell.Win32ShellFolderManager2.get(Unknown Source) at sun.awt.shell.ShellFolder.get(Unknown Source) at javax.swing.plaf.metal.MetalFileChooserUI.updateUseShellFolder(Unknown Source) at javax.swing.plaf.metal.MetalFileChooserUI.installComponents(Unknown Source) at javax.swing.plaf.basic.BasicFileChooserUI.installUI(Unknown Source) at javax.swing.plaf.metal.MetalFileChooserUI.installUI(Unknown Source) at javax.swing.JComponent.setUI(Unknown Source) at javax.swing.JFileChooser.updateUI(Unknown Source) at javax.swing.JFileChooser.setup(Unknown Source) at javax.swing.JFileChooser.<init>(Unknown Source) at javax.swing.JFileChooser.<init>(Unknown Source) at FolderSelectApplet.startSelectFolder(FolderSelectApplet.java:54) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at sun.plugin.javascript.invoke.JSInvoke.invoke(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source) at sun.plugin.com.MethodDispatcher.invoke(Unknown Source) at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source) at sun.plugin.com.DispatchImpl$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.plugin.com.DispatchImpl.invoke(Unknown Source) java.lang.Exception: java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read) at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source) at sun.plugin.com.DispatchImpl$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.plugin.com.DispatchImpl.invoke(Unknown Source) ----------------------------------------- (その他にも、 grant codeBase "file:///C:/-" { permission java.security.AllPermission; }; grant codeBase "file:/C:/*" { permission java.security.AllPermission; }; grant codeBase "file:/C:/" { permission java.security.AllPermission; }; など、いろいろ記述を変えてみましたが、どれも同じ結果になりました。 ◆結果、やはり、codeBase〜 の記述の有無で例外の有無が決定している状態です。 しかし、アプレットの配置場所、HTMLのCODEBASE指定を見る限り、 私にはどこがいけないのか分かりません。 今、私の中にある疑問としては、 @CLASS_PATHが何か関係ある? A.java.policyを編集するだけではだめで、アプレットのソースの方で SecurityManagerもしくはAccessControllerあたりを使用した記述で コントロールする必要がある? といったところですが、どうなんでしょうか? |
|
投稿日時: 2006-02-09 22:22
例外のスタックトレースで
> at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source) というのが見受けられましたが、 Javascriptからjavaのメソッドを読んでいるようなプログラム ではないですか? もしそうであれば、セキュリティの関係上ポリシーファイルのコード ベースはききません。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5011139 はずしていたら、ごめんなさい。 |