12

http:// localhost:8080/index.htmlにある単純なHTMLページにJavaアプレットを挿入しました。

<applet id="applet" code="SomeCode.class" archive="lib.jar" Width="1" Height="1"></applet>

Javaアプレットには、以下のコードのようなメソッドがあります。

public void PostStuffToServer() {
  String server = "http://localhost:8080/PostHandler.ashx";
  URL u = new URL(server);
  URLConnection con = u.openConnection();
  con.setDoOutput(true);
  con.getOutputStream().write(stream.toByteArray());
  con.connect();
}

JavaScriptからアプレットコードを実行すると、次のようになります。

obj = document.getElementById('applet');
obj.getClipboardImageURL();

次のエラーが発生します。

アクセスが拒否されました(java.net.SocketPermission 127.0.0.1:8080 connect、resolve)

Javaコードは、ドメインlocalhostを同等のIPアドレスに解決するため、クロスドメインのセキュリティ制限が発生するようです。http://127.0.0.1:8080/index.htmlから同じコードを実行すると、正常に動作します。lib.jarファイルは署名されています。

これを回避する方法はありますか?

4

10 に答える 10

14

Java 6 Update 22 をインストールした後、同じ問題に遭遇しました。私のアプレットは数年間オンラインであり、エラーは報告されていません。バージョン 6 Update 21 にダウングレードすると、すべてが完璧に機能します。私のアプレットは署名されていません。

解決策: 問題の原因を見つけるのにかなりの時間がかかりました。実際、私の場合、セキュリティ エラーの原因となったいくつかの要因がありました。この問題は、crossdomain.xml ファイルによって解決されました。Java アプレットはクロスドメイン ファイルのダウンロードを試みましたが失敗し、Java コンソールにエラーを表示することさえしませんでした (デバッグ レベル 5)。Java は、Web サイトのルート (http://domain-name/crossdomain.xml) ではなく、ドメインの IP アドレス (http://ip-address/crossdomain.xml) からファイルをダウンロードしようとしました。セキュリティ面で優れていると思いますか?次に、IP アドレスでクロスドメイン ファイルを公開するように Web サーバーを構成する必要がありました。私の場合、セキュリティ上の理由から ISS の既定の Web サイトを削除し、新しい Web サイトを作成する必要がありました。次に、フラッシュで使用するクロスドメイン ファイルで Java アプレットが機能しないことを発見しました。

<?xml version="1.0"?>
<cross-domain-policy>
   <site-control permitted-cross-domain-policies="master-only"/>
   <allow-http-request-headers-from domain="*" headers="*"/>
   <allow-access-from domain="*" />
</cross-domain-policy>

アプレットを機能させるには、xml ファイルから site-control ノードと allow-http-request-headers-from ノードを削除する必要がありました。

于 2010-11-10T07:25:16.307 に答える
10

遅すぎると思いますが、ともかく... この問題の解決策がどれほど簡単かは信じられません。

問題は、JavaScript から呼び出された Java アプレット コードが、JavaScript のコードとアプレット コードの共通部分であるアクセス許可しか持たないことです。JavaScript のアクセス許可が少ないと見なされ、この例外が発生します。

これが私がしたことです: innocentFunc()java.net.SocketPermission 例外をスローする関数があると仮定すると、コードは次のようになります。

String s = innocentFunc();

今できることは、次のように変更することです。

String s = AccessController.doPrivileged(
      new PrivilegedAction<String>() {
          public String run() {
              return innocentFunc();
          }
        }
     );

この AccessController 呼び出しは、基本的に、実行するコードが呼び出しチェーンからのアクセス許可に従うのではなく、呼び出し元のアクセス許可だけに従うべきであることを Java 仮想マシンに通知します。

もちろん、innocentFunc悪意のあるコードによって呼び出されたとしても、この呼び出しが悪いことをしないことを確認した後でのみ、このようなことを行う必要があります。

于 2011-06-06T08:13:36.137 に答える
2

Update 21ではなく、Update22でも同じことがわかります。

JavaScriptで制御しているTinyPlayerアプレットを使用しています。

アプレットがロードされているページと同じドメイン(mydomain.example.com、IP 1.2.3.4)からオーディオファイルをロードしています。すべてが相対URLを使用して参照されています。

オーディオを再生しようとすると、再生に失敗し、次のようになります。アクセスが拒否されました(java.net.SocketPermission 1.2.3.4:80 connect、resolve)

アクセスログを見ると、これが発生する直前にcrossdomain.xmlのリクエストが表示されます。ただし、Javaがmydomain.example.com/crossdomain.xmlからcrossdomain.xmlを要求しているのではなく、1.2.3.4/crossdomain.xmlから要求していることが問題です。

私にとってはうまくいくと思われる回避策は、IPアドレス1.2.3.4に応答する仮想ホストを設定し、それにcrossdomain.xmlを指定して、Javaが(間違った)場所でcrossdomain.xmlを見つけられるようにすることです。それを探しています。

私はちょうど内容でテストしました:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="*" />
</cross-domain-policy>

...しかし、これをより制限的にすることはおそらく可能です。

そこにあると、オーディオは正しく再生されます。

于 2010-11-13T02:21:46.790 に答える
2

追加するために、私が得ている問題と正確に一致するものがここにいくつかあります-それは特にJavaScriptでアプレットを制御することについて言及しています。

http://www.oracle.com/technetwork/java/javase/6u22releasenotes-176121.html

CVE-2010-3560 の修正により、新しい Java Plug-in で実行されている特定の Java アプレットが、ネットワーク セキュリティ権限を必要とするアクションを実行するために Java を呼び出す JavaScript を含む Web ページに埋め込まれている場合、動作を停止する可能性があります。元の Web ページ URL のホスト名を解決したネーム サービスが逆アドレス ルックアップの結果として一致する名前を返さない場合、これらのアプレットはネットワーク セキュリティの例外で失敗する場合があります。

彼らの提案は、次のような、Java 用の特別なクレイジーな A レコードを DNS に追加することです。

10.11.12.13    foo.bar.com.auth.13.12.11.10.in-addr.arpa
于 2010-11-13T12:16:54.873 に答える
1

参照: http://download.oracle.com/javase/tutorial/deployment/applet/security.html

署名されていないアプレットは、次の操作を実行できます。

それらは、元のホストへのネットワーク接続を確立できます。

Java が元のシステムを localhost に解決しない場合、アプレットはソケットを開くことができません。

于 2011-02-27T20:21:30.813 に答える
1

同様の問題があり、アプレットを含むページの URL の一部として「localhost」を使用した場合にのみ発生します。URL の一部として実際のホスト名または IP アドレスを含む URL を使用した場合、問題は発生しませんでした。これが Java プラグインの欠陥かどうかはわかりません...

たとえば、http://localhost:9080/app_id/appletPageのような URL を使用すると問題が発生しましたが、実際の IP またはホスト名を使用して URL を使用すると問題は発生しませんでした。

于 2011-07-28T09:11:31.810 に答える
1

IIRC、JavaScript 同一オリジン ポリシーは、同一ホスト/異なるポートへのアクセスを防止します。PlugIn の LiveConnect は、このポリシーを localhost のみに適用します。

于 2010-11-09T15:14:35.933 に答える
0

仮想ディレクトリのアクセス許可を確認する必要があります。

于 2010-11-29T06:17:26.663 に答える
0

crossdomain.xml ファイルをより制限的にすることはできないと思います。現在、Java アプレットは (domain="*") のみをサポートしています。

ここを参照してください http://www.oracle.com/technetwork/java/javase/index-135519.html#CROSSDOMAINXML

于 2010-11-25T23:38:34.740 に答える