セキュリティ例外のロード時にウェブのイメージのjar
質問
私が作り出してしまおうというものには、javaアプレットをjarを実行するブラウザでダウンロードからの画像のURLを表示するために使用しています。私の実施には:
try {
String imageURL = "http://www.google.com/intl/en_ALL/images/logo.gif";
URL url = new URL(imageURL);
img = ImageIO.read(url);
} catch (IOException e) {
System.out.println(e);
}
で与えられることになるセキュリティ例外:
java.security.AccessControlException: access denied (java.net.SocketPermission www.google.com:80 connect,resolve)
【解決
私の実施ナイフアクション-イエスの提案により、動作すること ウェブブラウザ ものを使用しないアプレットビューア).
のアプレットビューア まだまだ出会い:
java.security.AccessControlException: access denied (java.net.SocketPermission www.google.com:80 connect,resolve)
積載時のウェブページをブラウザが信拒否というダイアログボックスばかりをクリックし信頼、その画像に表示されます。
これらの操作をしているところ:
ant makejar
jarsigner -keystore keystore-name -storepass password -keypass password web/LoadImageApp.jar alias-name
jarsigner -verify -verbose web/LoadImageApp.jar
appletviewer web/index.html ## as mentioned above, this gives a security exception. instead, load the webpage in a browser.
どんな問題が発生したか分からなjarsigner-検証には:
Warning: The signer certificate will expire within six months.
332 Thu Jan 07 20:03:38 EST 2010 META-INF/MANIFEST.MF
391 Thu Jan 07 20:03:38 EST 2010 META-INF/ALIAS-NA.SF
1108 Thu Jan 07 20:03:38 EST 2010 META-INF/ALIAS-NA.DSA
sm 837 Thu Jan 07 20:03:38 EST 2010 LoadImageApp$1.class
sm 925 Thu Jan 07 20:03:38 EST 2010 LoadImageApp.class
sm 54 Wed Jan 06 01:28:02 EST 2010 client.policy
s = signature was verified
m = entry is listed in manifest
k = at least one certificate was found in keystore
i = at least one certificate was found in identity scope
jar verified.
次のjavaソースコードを強調をコンセプトに、私はすべて撤去されたこと例外処理/nullチェック):
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.swing.*;
import java.net.*;
import java.security.*;
public class LoadImageApp extends JApplet
{
private BufferedImage img;
private final String imageURL = "http://www.google.com/intl/en_ALL/images/logo.gif";
public void init()
{
loadImage();
}
public void paint(Graphics g)
{
if (null != img) { g.drawImage(img, 0, 0, null); }
}
public void loadImage()
{
AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
try
{
URL url = new URL(imageURL);
if (null == url)
{
throw new MalformedURLException();
}
img = ImageIO.read(url);
}
catch (Exception e) { e.printStackTrace(); }
return null;
}
});
}
}
解決
ランニングの例外ではデフォルトアプレットに負荷サンドボックス安全保障、サンドボックスをすることができるだurlへの接続ドメインのアプレット.の意味を作成することはできませんのurl接続googleない限り、アプレットが開催。
を行う必要があります。以下のために正しく接続し、リモートurl
を自己署名証明書の少なくとも理想的で検証された証明書のリンクをベリサインまたはその他の証明書発行局(CA)の希望する 証明書の指示
署名のjarを使用jarsigner. 署名の指示
今まであなたを包み込むコードは、特権ブロックとしており
try
{
final String imageURL = "http://www.google.com/intl/en_ALL/images/logo.gif";
URL url = (URL) AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
try
{
return new URL(imageURL);
}
catch (MalformedURLException e)
{
e.printStackTrace();
return null;
}
}
});
if(url == null)
{
// Something is wrong notify the user
}
else
{
// We know the url is good so continue on
img = ImageIO.read(url);
}
}
catch (IOException e)
{
System.out.println(e);
}
I輸入自のアプレットコードを取り替えもありますし、引き、独自のインスタンス生成の特権ブロックとを有するブロックを返します。この作品は僕の負荷がブラウザ.
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.swing.*;
import java.io.IOException;
import java.net.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
public class LoadImageApp extends Applet
{
private BufferedImage img;
private final String imageURL = "http://www.google.com/intl/en_ALL/images/logo.gif";
public void init()
{
loadImage();
}
public void paint(Graphics g)
{
if (null != img) { g.drawImage(img, 0, 0, null); }
}
public void loadImage()
{
URL url = (URL) AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
try
{
return new URL(imageURL);
}
catch (Exception e) { e.printStackTrace(); }
return null;
}
});
try {
img = ImageIO.read(url);
} catch (IOException e) {
e.printStackTrace();
}
}
}
他のヒント
いま、アプレットではなく、通常のアプリケーション.アプレットが許可されない取得する他の資源外部のドメインがロードされています。その考え方としては、防止のた"悪い"アプリケーションから呼び出しのようなもの
String targetURL = "http://www.foo.bar/spoof?source" + System.getProperty("...);
または移その他の種類のデータを知らない。
から取得する際に必要な外部データまで サイン おapplet.
- ファイルを作成し、"。すべての"同じフォルダのjar
コピー/貼り付け、以下のテキストで
助成{許可java.ます。AllPermission;};
アプリケーションを起動しようになります:
java-jar yourjar.jar -Djava.ます。政策=。すべての
いまだその実現に努めてい jar
ファイルから実行されるコマンドラインがアプレットを実行されます。という場合はtrue、だいてのデモインのホテルを表示でアプレットでのみサーバーへのアクセスもロードされています。まアクセスしたいその他のサーバーからのアプレットには、署名のアプレット;Googleで探しのお手伝いをします。