Sicherheits Ausnahme beim Laden von Web-Bild im Glas
Frage
Ich versuche, ein Java-Applet jar zu erstellen, die in einem Browser ausgeführt wird, laden Sie ein Bild von einer URL, und zeigt sie an den Benutzer. Meine Implementierung ist:
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);
}
Aber es gibt mir eine Sicherheitsausnahme:
java.security.AccessControlException: access denied (java.net.SocketPermission www.google.com:80 connect,resolve)
Lösung:
Ich habe implementiert Knife-Aktion-Jesus Vorschlag, und es funktioniert in einem Web-Browser (aber den Applet-Viewer nicht verwenden).
Nur mit dem Applet-Viewer ich noch begegnen:
java.security.AccessControlException: access denied (java.net.SocketPermission www.google.com:80 connect,resolve)
Wenn Sie die Webseite in einem Browser geladen wird, gibt es ein Vertrauen / Deny-Dialogfeld, wenn ich Vertrauen klicken, dann wird das Bild angezeigt wird.
Dies sind die Schritte, die ich nehme:
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.
Die Ausgabe von jarsigner -verify ist:
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.
Hier finden Sie die komplette Java-Quellcode (das Konzept zu betonen, ich alle, dass zusätzliche Ausnahmebehandlung / null Prüfung entfernt):
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;
}
});
}
}
Lösung
Ihr laufen in die Ausnahme, da standardmäßig Applets geladen werden in die Sandbox-Sicherheit, Sandbox können Sie nur url Verbindungen zur Domäne dient, das Applet machen. Das heißt, Sie können nicht eine URL Verbindung Google erstellen, wenn Sie von Google gehostet Applet ist.
Sie müssen die folgenden, um zu tun, um richtig zu einer Remote-URL zu verbinden.
Erstellen Sie ein selbst signiertes Zertifikat zumindest, im Idealfall haben Sie eine überprüfte Zertifikat Verknüpfung zurück durch verisign oder eine andere Zertifizierungsstelle (CA) Ihre Wahl. Zertifikat Anweisungen
Melden Sie Ihr Glas jarsigner verwenden. Signing Anleitung
Jetzt können Sie Ihren Code in einem privilegierten Block wickeln wie folgt
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);
}
Ich importierte Applet-Code, ich um einen Teil davon eingeschaltet, über das img Instanziierung Ziehen des privilegierten Blockes & mit dem Block eine URL zurück. Dies funktioniert, wenn ich es in einen Web-Browser laden.
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();
}
}
}
Andere Tipps
Es scheint, dass Sie ein Applet statt einer normalen Anwendung laufen lassen. Ein Applet ist keine Ressourcen außerhalb der Domäne abzurufen erlaubt es aus geladen wurde. Die Idee ist, „schlecht“ Anwendungen von Aufruf etwas wie
zu verhindernString targetURL = "http://www.foo.bar/spoof?source" + System.getProperty("...);
oder andere Arten von Daten zu einem unbekannten Ziel Übertragung.
Wenn Sie wirklich externe Daten abrufen, müssen Sie müssen Zeichen Ihr Applet.
- Erstellen Sie eine Datei call "policy.all" im gleichen Ordner Ihrer jar
-
Kopieren / fügen Sie den folgenden Text in ihm:
grant {permission java.security.AllPermission;};
-
Anwendung starten wie folgt aus:
java -jar yourjar.jar -Djava.security.policy = policy.all
Klingt wie Sie keine jar
-Datei zu erstellen versuchen, die von der Kommandozeile ausgeführt werden, aber ein Applet, das im Browser ausgeführt wird. Wenn das wahr ist, bist du ziemlich viel Glück, weil Applets nur erlaubt sind, auf den Server zuzugreifen sie geladen wurden. Wenn Sie wirklich andere Server von einem Applet zugreifen möchten, müssen Sie Ihr Applet unterzeichnen; Google kann Ihnen helfen, mehr Informationen zu finden.