Javaアプレットが http:// localhost:8080/index.html)にあるシンプルなHTMLページに挿入されています :
<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ファイルは署名されています。
これを回避する方法はありますか?
Java 6 Update 22をインストールした後、同じ問題が発生しました。アプレットは数年間オンラインであり、エラーは報告されていません。バージョン6 Update 21にダウングレードすると、すべてが完璧に機能します。アプレットが署名されていません。
解決策:問題の原因を見つけるのにしばらく時間がかかりました。実際、私の場合、セキュリティエラーを引き起こしたいくつかの要因がありました。この問題はcrossdomain.xmlファイルによって解決されました。 Javaアプレットはクロスドメインファイルをダウンロードしようとして失敗し、Javaコンソール(デバッグレベル5)にエラーを表示することさえしませんでした。 Java私のウェブサイトのルート(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ノードを削除する必要がありました。
遅すぎると思いますが、とにかくこの問題の解決策がどれほど簡単かは信じられません。
問題は、Java JavaScriptから呼び出されたアプレットコードには、JavaScriptのコードとアプレットコードの共通部分である権限のみがあり、JavaScriptの権限が少ないと見なされ、この例外が発生することです。 。
これが私がしたことです:あなたがJava_net.SocketPermission例外を投げる関数innocentFunc()
を持っていると仮定すると、あなたのコードは次のようになります:
String s = innocentFunc();
ここでできることは、次のように変更することです。
String s = AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
return innocentFunc();
}
}
);
このAccessController呼び出しは、基本的にJava仮想マシンに、それが実行するコードは呼び出しチェーンからの許可に従うのではなく、呼び出し元の許可のみに従うべきであると述べています。
もちろん、悪意のあるコードによって呼び出されたとしても、このinnocentFunc
呼び出しが何も悪いことをしないことを確認した後でのみ、このようなことを行う必要があります。
Update 21ではなく、Update 22でも同じ結果になります。
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からではなく
Javaがクロスドメインを検出できるように、IPアドレス1.2.3.4に応答する仮想ホストをセットアップし、それにcrossdomain.xmlを与えることで、私にとってはうまくいくと思われる回避策です。探している(間違った)場所の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>
...しかし、これをもっと制限することはおそらく可能です。
これで、オーディオは正しく再生されます。
付け加えると、ここに私が得ている問題と完全に一致するものがいくつかあります-具体的には、JavaScriptによるアプレットの制御について言及しています。
http://www.Oracle.com/technetwork/Java/javase/6u22releasenotes-176121.html
CVE-2010-3560の修正により、特定のJava新しいアプレットで実行中のアプレットJavaプラグインがWebページに埋め込まれている場合、プラグインが機能しなくなる可能性があります。 Javaを呼び出すJavaScriptを含み、ネットワークセキュリティ権限を必要とするアクションを実行します。これらのアプレットは、元のWebページのURLホストを解決したネームサービスが名前は、アドレスの逆引きの結果として一致する名前を返しません。
彼らの提案は、次のように特別なクレイジーなJava専用Java AレコードをDNSに追加することです。
10.11.12.13 foo.bar.com.auth.13.12.11.10.in-addr.arpa
IIRC、JavaScriptの同じオリジンポリシーにより、同じホスト/異なるポートへのアクセスが禁止されます。プラグインのLiveConnectは、localhostにのみこのポリシーを適用します。
参照: http://download.Oracle.com/javase/tutorial/deployment/applet/security.html
未署名のアプレットは、次の操作を実行できます。
元のホストにネットワーク接続できます。
Javaが元のシステムをlocalhostに解決しない場合、アプレットはソケットを開くことができません。
同様の問題があり、アプレットのあるページのURLの一部として「localhost」を使用した場合にのみ発生します。実際のホスト名またはIPアドレスをURLの一部として使用した場合、問題は発生しませんでした。これがJavaプラグインの欠陥であるかどうかはわかりません...
たとえば http:// localhost:9080/app_id/appletPage のようなURLを使用した場合、問題が発生しましたが、実際のIPまたはホスト名を使用してURLを使用した場合、問題は発生しませんでした。
現在、crossdomain.xmlファイルをより制限的にすることはできないと思いますJavaアプレットは(domain = "*")のみをサポートします
こちらをご覧ください http://www.Oracle.com/technetwork/Java/javase/index-135519.html#CROSSDOMAINXML
仮想ディレクトリのアクセス許可を確認してください。
上記の@Kristianからの更新で私の一日が救われました。
Webアプリケーションのアプレットからaccess denied (Java.net.SocketPermission <server_ip>:<server port> connect,resolve)
を取得しました。
アプリケーションサーバーのロードバランサーのIPがドメインの名前に解決されないように、DNSが変更されていました。したがって、アプレットからサーバーへの疑わしい「クロスドメイン接続」がブロックされました。 crossdomain.xmlを追加しました
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy>
<Tomcat-home>/webapps
にアクセスし、http://<server name>:<server port>/crossdomain.xml
でアクセスできることを確認しました