web-dev-qa-db-ja.com

アプレットでJava.security.AccessControlException:アクセスが拒否された(Java.net.SocketPermission ...)のはなぜですか。どうすれば回避できますか。

私のクライアントがSafariでJavaセキュリティ例外が発生している理由を知りません。誰でも手伝ってくれるでしょうか?

この例外は、WindowsのSafariで確実に発生します。これにはJavaアプレットが含まれます。WindowsVista上のFirefoxおよびIE8でも例外が発生します。

再現する手順は次のとおりです。

  1. WindowsでSafariを開く

  2. ここをクリック: http://www.cengraving.com/s/item?itemId=CH0

  3. 「カスタマイズ」(画面下部)をクリックします

  4. 「インスタントプルーフ」ページが読み込まれたら、「カートに追加」をクリックします。

完全なスタックトレース:

Java.security.AccessControlException: access denied (Java.net.SocketPermission www.cengraving.com resolve)
    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.checkConnect(Unknown Source)
    at Sun.plugin.security.ActivatorSecurityManager.checkConnect(Unknown Source)
    at Java.net.InetAddress.getAllByName0(Unknown Source)
    at Java.net.InetAddress.getAllByName(Unknown Source)
    at Java.net.InetAddress.getAllByName(Unknown Source)
    at Java.net.InetAddress.getByName(Unknown Source)
    at Sun.net.www.http.HttpClient.New(Unknown Source)
    at Sun.net.www.http.HttpClient.New(Unknown Source)
    at Sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
    at Sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at Sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
    at Sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at com.designapplet.a.f.a(Unknown Source)
    at com.designapplet.ui.c.a(Unknown Source)
    at com.designapplet.ui.c.for(Unknown Source)
    at com.designapplet.ui.DesignApplet.buy(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.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.JSInvoke.invoke(Unknown Source)
    at Sun.reflect.GeneratedMethodAccessor2.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.liveconnect.PrivilegedCallMethodAction.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
Java.net.MalformedURLException: no protocol: 
    at Java.net.URL.<init>(Unknown Source)
    at Java.net.URL.<init>(Unknown Source)
    at Java.net.URL.<init>(Unknown Source)
    at Sun.plugin.liveconnect.SecureInvocation.checkLiveConnectCaller(Unknown Source)
    at Sun.plugin.liveconnect.SecureInvocation.access$000(Unknown Source)
    at Sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
Java.net.MalformedURLException: no protocol: 
    at Java.net.URL.<init>(Unknown Source)
    at Java.net.URL.<init>(Unknown Source)
    at Java.net.URL.<init>(Unknown Source)
    at Sun.plugin.liveconnect.SecureInvocation.checkLiveConnectCaller(Unknown Source)
    at Sun.plugin.liveconnect.SecureInvocation.access$000(Unknown Source)
    at Sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
17
Crashalot

回答ありがとうございます。賞金は授与しませんでした。回答はすべて役に立ちましたが、問題を完全に解決するものはありませんでした。

最終的に、アプレットからWebページにデータを渡してからAJAX呼び出しを実行してサーバーと通信することで問題を解決しました。最もエレガントな解決策ではありませんが、確かに、これまでのところ効果的です。

それを試してみてください、そして、それがあなたのために働くかどうか、lemmeは知っています。

再度、感謝します!

2
Crashalot

SecurityManagerが使用するデフォルトのセキュリティポリシーファイルを上書きできます。

1)テキストファイルを作成します(例:applet.policy)

2)アプレットにすべての権限を付与します

  grant {
   permission Java.security.AllPermission;
  };

3)でアプレットを実行する

-J-Djava.security.policy=applet.policy
16
Seb74

同じ問題がありました。そして、アプレットに自己署名することでこれを解決しました...

次の手順を使用し、それはうまくいった

javac AppletClass.Java
jar cvf AppletClass.jar AppletClass.class
keytool -genkey -validity 3650 -keystore pKeyStore -alias keyName
keytool -selfcert -keystore pKeyStore -alias keyName-validity 3650
jarsigner -keystore pKeyStore AppletClass.jar keyName

それが尋ねる質問に答えるだけで、それは仕事をします

注:ローカルの読み取り/書き込みファイルのエラーが発生しました

9
Varun

私は同じ問題を抱えています! JavaScriptは、同じドキュメントに埋め込まれているアプレットのパブリックメソッドを呼び出します。これにより、アプレットが「ホーム」から一部のデータをロードするようにトリガーされるため、アプレットがロードされたのと同じドメインへの接続を開く必要があります。これは、それ以上の特権のない署名されていないアプレットに対しても許可されます。

また、このセキュリティ例外はSafari(Windowsでは5.0.2、JRE 1.6.0_22)でのみ認識されました。 IEおよびFireFoxの同じアプレットがうまく機能しています。

また、これはJava Safariのサンドボックスのバグであると考えています。


編集:doPrivilegedを使用しても効果はありませんでしたが、この回避策を見つけました:タイマーイベントを介してリクエストされた実行からJavaScript呼び出しを「分離」した場合、Safariがゲームに設定するセキュリティ制限によって実行が禁止されなくなります。詳細に:

  • javaScriptから呼び出されるメソッドは、javax.swing.Timerのみを作成します(1つのイベントをスケジュールするため、repeatプロパティをfalseに設定する必要があります)。遅延を非常に短く設定できます(例:50ミリ秒)。
  • 呼び出されるメソッド呼び出しは、タイマーによって呼び出されるActionEventリスナー(actionPerformed)に配置する必要があります。

状況をもう少し複雑にする可能性がある1つの問題は、actionPerformedコンテキストでは静的変数のみにアクセスできることです。 JavaScript呼び出しに変数が含まれている場合、これらは最初に呼び出されたメソッドによって、スケジュールされたイベントが後で値を読み取ることができる静的な「バッファー」変数に配置する必要があります。

私のテストでは、javax.swing.Timerのみが必要なデカップリングを提供しましたが、Java.util.Timerはその目的には使用できませんでした。

4
Hacky

これはアプレットですか?そうであれば、ソケットにアクセスするためにアプレットに署名する必要があります(これはあなたがやっていることのようです...)

詳細はこちらをご覧ください:

http://Java.Sun.com/developer/onlineTraining/Programming/JDCBook/signed.html

0
Starkey

Linuxでは動作します。

_Add to cart_ボタンは関数を実行します

_  function saveLayout() {

    showSaveMsg();
    var status = document.app.buy();
    var loc = "http://www.cengraving.com/s/cart";

    if (status == 'GOOD') {
      window.location = getCartUrl();
    } else {
      showErrorMsg(status);
    }
  } 
_

いくつかの備考:

  • ローカル変数locがアプリの呼び出しの後に定義され、それでも使用されないのは正常ですか?

  • また、trycatchが役立つ場合があります(JavaScriptでは、app.buy()呼び出しをラップします)。

  • その上、私はネットで少し調査を行い、一部の人々-同じエラーを持っているが使用方法が異なる-がClassPath問題を報告しています。関連するJREの利用を妨げる可能性のある具体的な事項はありますか?

0
Ring Ø

これはセキュリティ例外として現れていますが、問題は本当に悪いURLです。スタックをたどると、MalformedURLExceptionがあることがわかります。

これはおそらく、URLを予期していた場所にURIを渡すことによって引き起こされます。外観からLiveConnect APIを介して。私はそれが期待されている場所でホスト名を見つけておらず、デフォルト、おそらくlocalhostに接続しようとしていると思います。これはSecurityManagerによって禁止されているため、SecurityExceptionになります。

Hrefでは、ブラウザがページ自体のURLに対してそれを解決して完全なURLを生成するため(例: http://example.com/somepath)、URI(例:HREF = "/ somepath")を使用できます。 )。

Java [適切なURLコンストラクター] [1]を使用して)でそれを行うことができます。

更新:ああ、私は誤解しました;それは単一のスタックトレースだと思いました。

以前は、liveconnectがjar:urlにアクセスして任意のソケット接続を取得できるというバグがありました。これを修正すると、liveconnectスレッドからURL接続を開くときに問題が発生する可能性があります。 buyメソッドで、スレッドを開始して接続を実行するとどうなりますか?

[1]: http://download.Oracle.com/javase/6/docs/api/Java/net/URL.html#URL(Java.net.URL 、Java.lang.String )

0
Devon_C_Miller

JREサンドボックスは、有害なことを行うためにJavaScriptが生成したメソッド呼び出しを防止しようとしますが、それだけでプログラマーの生活が困難になります。

私が見つけた最良の回避策は、javascriptからの呼び出しと実際の「ダーティワーク」の間の非常に疎結合を実装するプロデューサー&コンシューマーデザインパターンのイベントキューを構築することです。

本当にひどいのは、XPまたはWin7で正常に実行されるコードがVistaで例外をスローする可能性があることです。

0
Hasa