Tip:Unsigniertes Applet lädt Seiten von entferntem Server!

  • Themenstarter Themenstarter Spacerat
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

Spacerat

Gast
Hallo zusammen.

Ich schreibe an einem Applet, welches den Status einen entfernten Streamservers abruft. Da nur ein signiertes Applet mit gewissen Rechten eine Socket-Verbindung zu einem entfernten Server aufbauen darf und ich mir den ganzen Sch... mit Zertifikaten installieren usw. eigentlich schenken wollte, nahm ich einen Umweg über ein im CodeBase- oder DocumentBase-Verzeichnis liegendes PHP-Script, welches seinerseits den Status abfragen sollte. Die normale Status-Abfrage liefert eine HTML-Seite mit einer Grafik (onX.gif bzw. offX.gif; X=mode). Das Applet soll nur erfahren, welche von beiden angezeigt werden würde (Es fragt den Namen ab).

Das ganze sieht etwa so aus.

PHP-Script auf dem AppletServer im CodeBase- oder DocumentBase-Verzeichnis:
Code:
<?php
$action = (isset($_GET['action'])? $_GET['action'] : "status";
$mode = (isset($_GET['mode'])? $_GET['mode'] : "1";
$host = "devel.mshome.net/streamserver";
$id = "12345";

$status = "status.php";
$statistics = "statistics.php";

$location = "Location: http://".$host."/";

if ($action == "status") {
    header ($location.$status."?member=".$id."&mode=".$mode);
    exit ();
} elseif ($action == "statistics") {
    header ($location.$statistics."?member=".$id."&mode=".$mode);
    exit ();
}
?>

Auszug aus dem Applet-Code:
Code:
private boolean getStatus()
{
    boolean ret = false;
    String tmp1 = "";
    String tmp2 = "on" + smode + ".gif";
    try {
        URL tmp = new URL(DocBase, "OnAir." + type + "?mode=" + smode + "&action=status");
        tmp1 = getStatusText(tmp);
        if (tmp1.equals("")) {
            tmp = new URL (CodBase, "OnAir." + type);
            tmp1 = getStatusText(tmp);
        }
        if (tmp1.equals("")) System.err.println("OnAir.class: OnAir." + type + " not found.");
    } catch (MalformedURLException e) {
    }
    ret = (tmp1.indexOf(tmp2) != -1)? true : false;
    return ret;
}

private String getStatusText(URL tmp)
{
    String rc = "";
    System.out.println(tmp.toString());
    try {
        HttpURLConnection con = (HttpURLConnection) tmp.openConnection();
        con.setDoInput(true);
        con.setUseCaches(false);
        con.setRequestMethod("GET");
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        DataInputStream in = new DataInputStream(con.getInputStream());
        //Die hier erscheinende AccessControlException sollte doch eigenlich vermieden werden.
        //den restlichen Code spar ich mir.
    } catch (IOException e) {
        rc = "";
    }
    return rc;
}

Scheinbar wird der PHP-Datei vom Applet "verboten", auf diese Weise weiter zu leiten. Die dort erscheinende Exception "access denied (SocketPermission devel.mshome.net resolve)" war doch genau das was ich zu umgehen versuchte.

Die Problemlösung gestaltete sich nun etwa so. Ist nur die Frage, ob das auch auf jedem Server funktioniert. PHP-Progger sollten wissen, das "include" von Fremdservern meist nicht so klappt, wie man sich das vorstellt.
Code:
<?php
$action = (isset($_GET['action'])? $_GET['action'] : "status";
$mode = (isset($_GET['mode'])? $_GET['mode'] : "1";
$host = "devel.mshome.net/streamserver";
$id = "12345";

$status = "status.php";
$statistics = "statistics.php";

$location = "http://".$host."/";

if ($action == "status") {
    include ($location.$status."?member=".$id."&mode=".$mode);
    exit ();
} elseif ($action == "statistics") {
    include ($location.$statistics."?member=".$id."&mode=".$mode);
    exit ();
}
?>

So, nun hoffe ich, das einige, die mit PHP-Scripten und Applets ebenso Probleme hatten, mit dem Beschriebenen was Anfangen können. Die Administratoren bitte ich um Nachsicht für den langen Beitrag.
 
Dieses header(...) leitet die Anfrage ja nur weiter so dass das Applett immer noch die die Verbindung zu dem 'verbotenen' Host herstellen muss.
Einfachste Lösung: das php-script stellt eine Verbindung zum verbotenen Host her, liest alles entsprechend ein und gibt es aus.
 
Wie bitte?? Heisst das es gibt noch eine Möglichkeit, die definitiv immer funktioniert? Meine "include"-Geschichte ist ja nicht so ganz astrein, da sie nur funktioniert, solange PHP nicht im Safe-Mode ausgeführt wird (nehme ich mal ganz stark an). Das ganze war eben nur ein kleiner Versuch im Heim-Netzwerk (Apache-Webserver (Linux) -> Internet-Explorer 5.5 (WinXP). Und wenn ich PHP im Safe-Mode laufen lasse, heisst das nicht, das ich ihn auch "SAFE" konfiguriert habe.

Wäre für eine bessere Lösung, die auch im PHP-Safe-Mode läuft, sehr dankbar.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben