Frage

Ich habe ein einfaches selbstsignierten ein Applet (done mit keytool und jarsigner):

public class NetAppletLauncher extends JApplet {

    private static final long serialVersionUID = 1L;

    public void init() {
        exec("notepad c:/hello.txt");
    }

    public void exec(String command) {

        try {

            // launch EXE and grab stdin/stdout and stderr
            Process process = Runtime.getRuntime().exec(command);
            //      OutputStream stdin = process.getOutputStream();
            InputStream stderr = process.getErrorStream();
            InputStream stdout = process.getInputStream();

            // "write" the parms into stdin
//          stdin.write(arguments.getBytes());
//          stdin.flush();
//          stdin.close();

            // clean up if any output in stdout
            String line = "";
            BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stdout));
            while ((line = brCleanUp.readLine()) != null) {
                //System.out.println ("[Stdout] " + line);
            }
            brCleanUp.close();

            // clean up if any output in stderr
            brCleanUp = new BufferedReader(new InputStreamReader(stderr));
            while ((line = brCleanUp.readLine()) != null) {
                //System.out.println ("[Stderr] " + line);
            }
            brCleanUp.close();

        } catch (Exception exception) {
            exception.printStackTrace();
        }

    }

}

Im Grunde, was es tut, ist, dass es ausführt Notepad c: /hello.txt '.

Dann binde ich das Applet in HTML:

<applet id='applet' name='applet' archive='NetAppletLauncher1.jar' code='src.NetAppletLauncher' width='100' height='100' MAYSCRIPT ></applet>

Wenn ich die Seite besuchen, JRE startet und fragt mich, ob ich dieses Applet gestartet werden soll, und wenn ich ihm vertrauen. Ich drücke ok. Dann Notizblock beginnt - wie es sollte. Kein Problem hier.

Aber ich dies dann fügen Sie in die HTML-Seite an:

<p class="link" onclick="document.applet.exec('calc');">remote desktop2</p>

Nun, wenn ich auf diesem Text drücken, sollte ber beginnen - nicht wahr? Aber das gibt mir:

java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
  • whats up mit diesem? Warum geben Sie mir eine Sicherheitsausnahme jetzt, aber es könnte Notepad starten, bevor?
War es hilfreich?

Lösung 2

Das Problem mit, in Java:

exec(getParameter("command"));

und dann in JavaScript:

<script type="text/javascript">

function exec( command ) {

    var applet = "<applet id='applet' style='visibility: hidden' name='applet' archive='NetAppletLauncher4.jar' code='src.NetsetAppletLauncher' width='20' height='20' MAYSCRIPT ><param name='command' value='" + command + "' />Sorry, you need a Java-enabled browser.</applet>";

    var body = document.getElementsByTagName("body")[0];
    var div = document.createElement("div");
    div.innerHTML = applet;
    body.appendChild(div);

}

</script>

Andere Tipps

Das Java 2-Sicherheitsmodell erfordert (grob), dass jeder Rahmen auf dem Stapel muss eine Erlaubnis für die Zugangskontrolle Kontext (acc), dass die Erlaubnis zu haben, gewährt werden. JavaScript auf dem Stapel befindet und Dateizugriffsberechtigungen nicht hat.

Ich bin damit einverstanden: Es ist verboten, ein signiertes Applet von Javascript zu manipulieren, und die Abhilfe ist den Applet-Tag in Javascript auf der Seite Dokument neu zu schreiben

.

Ich fand diese Quelle mit einem wenig Theorie beweisen, wir sind richtig http://docs.oracle.com/javase/tutorial/deployment /applet/security.html#jsNote

Eigentlich Applet von Javascript Aufruf verhält sich wie unsigned Applet Aufruf (wie im jsnote angegeben: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote . Das ist in Ordnung und ist gültig, wenn Sie eine Klasse verwenden Sie sind nicht erlaubt zu ändern, aber da Sie den Autor der Java-Klasse sind, können Sie immer wickeln diese spezielle Methode, die Sie von Javascript aufrufen müssen in der privilegierten ausgeführt werden Modus wie folgt aus:

AccessController.doPrivileged(new PrivilegedAction<String>() {
    @Override
    public String run() {
        exec(command);
        return null;
    }
});

Und es sollte in Ordnung arbeiten. (Dies ist, was in dem upvoted Kommentar vorgeschlagen wird durch @ Jean-Philippe Jodoin aber die Verbindung vorausgesetzt, es ist gebrochen)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top