2009-05-11 23 views
2

署名されていないJavaアプレットが、アプレットを発信したサーバー以外のサーバーにネットワーク接続することは許可されていません。私のアプレットはサーバーとの会話が必要なので、これは私のアプリケーションでは問題ありません。私は私の開発マシン上のプロセスと通信するためのソケットをオープンしようとするテストアプレットを書いたときしかし、それは次の例外がスローされます。署名されていないJavaアプレットの発信元サーバーへのソケット接続

 
Error establishing socket connection: 
java.security.AccessControlException: 
    access denied (java.net.SocketPermission 127.0.0.1:11000 connect,resolve) 

例外を引き起こしたコード:

private void sendMsg(String msg) { 
    Socket s = null; 
    try { 
     s = new Socket("localhost", 11000); 
    } 
    catch (Exception e) { 
     System.err.println("Error establishing socket connection:"); 
     e.printStackTrace(); 
     return; 
    } 

    try { 
     OutputStream out = s.getOutputStream(); 
     out.write(msg.getBytes()); 
     out.flush(); 
     s.shutdownOutput(); 
     s.close(); 
    } 
    catch (Exception e) { 
     System.err.println("Error in writing to the socket:"); 
     e.printStackTrace(); 
    } 

最初は私の経験では私が見逃していたのは自分のコードの中で問題だったと思った。しかし、公式JavaチュートリアルのTalk Serverの例を実行しようとすると、同じ例外が発生します。これは私に実際にセットアップの問題や、デフォルトのセキュリティ制限の誤解があると信じさせてくれます。アプレットを提供しているマシンであっても、デフォルトのセキュリティマネージャは、アプレットを実行しているマシンに対してソケットを開くのを防ぎますか?もしそうなら、それは私にとっては問題です。配備されたシステムは、実際のサーバにログインしているユーザが、リモートユーザが使用するのと同じアプレットを使用する必要があるからです。例外を回避する方法はありますか?アプレットに署名する必要はありませんか?私は、必要でない場合、トラブルに行きたくありません。

注:私は、ユーザーがサーバーからアプレットにアクセスすることをお勧めしません。これはオリジナルのデザインではありませんでしたが、残念ながらこの実装を私に妥協させました。

更新: Webサーバーからアプレットのページを表示すると、問題が解決されます。サーバがローカルホストであっても。 Java 1.6.0_11のセキュリティアップデートは、ローカルファイルシステムから直接ロードされたアプレットにのみ適用されます。

+0

あなたは、どのWebサーバーを使っていますか教えてください。 –

答えて

4

これは、最近のセキュリティ更新プログラムで導入されたPlugInが変更されたためです。ごめんなさい!ローカルファイルシステムから読み込まれたアプレットには、localhostに対するソケットアクセス権が与えられなくなりました。

Solution 246387 : A Security Vulnerability in the Java Runtime Environment may Allow Code Loaded From the Local Filesystem to Access LocalHost

のJava Runtime Environment(JRE) コードがローカルホストにアクセスするためにローカル ファイルシステムからロードできます。この は、コードがリモートホストからロード であればそうでないことは許されないだろう ローカルホストへのネットワーク のアクセス権を持つようにその後実行悪意を持って ローカルファイルシステム上に置き、 されたコードを、可能にしてもよいです。これは、 をクッキーを盗んで セッション(ドメイン名は をローカルホストにマップするドメイン)を乗っ取るために利用されます。

+0

情報ありがとうございます。 "crosssite.xml"パーミッションファイルを使ってこの問題を回避できるかどうか知っていますか?私が時間を取ると、私はそれを試して、うまくいかなければ、あなたの答えを受け入れます。 –

+1

crossdomain.xml?ソケットレベルのアクセスではなく、URL接続でのみ動作します。あなたは本当に(小さな)Webサーバーが必要です。 –

2

ローカルのHTMLファイル(applet.htmlなど)からアプレットを実行していると思われます。これは、Tom Hawtinが言及しているエラーを引き起こします。

は、代わりにあなたのマシン上で(例えばTomcat)Webサーバを実行し、おそらくあまりにもあなたのウェブサーバにサーブレットからソケットポートをオープンする方がよいことになるhttp://localhost/applet.html

てファイルにアクセスします。このようにして、Webサーバーがシステム全体を管理し、マシン間での転送が簡単になります。

私はローカルホストとライブの両方でアプレットとサーブレットのソケット接続で定期的に同じ設定を使用します。

+0

ありがとうございました! Tomcatが私を助けます。 –

1

Oracleは、アプレットの使用を厳しく制限するJavaの問題を認識しています。Java Runtime Environmentのセキュリティ脆弱性により、ローカルファイルシステムからロードされたコードがLocalHostにアクセスする可能性があります。これはバグIDです。6704154

解決方法:この問題の回避策はありません。この「回避策」は2008年12月3日に発行されました。 Tomcatなどのサーバーでアプレットを使用したい場合は、Java 1.4.2に戻る必要があります。

これらの事実を完全に文書化するために、私は同じことをしています。ボート。

関連する問題