Question

J'ai une auto-signé facile une applet (fait avec keytool et 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();
        }

    }

}

En fait, ce qu'il fait, est qu'il exécute 'notepad c: /hello.txt'.

Puis-je intégrer l'applet en html:

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

Quand je visite la page, et commence JRE me demande si je veux commencer cette applet et si je faire confiance. Appuyez sur OK. Le Bloc-notes commence - comme il se doit. Pas de problème ici.

Mais j'ajoute ceci dans la page HTML:

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

Maintenant, quand je presse sur ce texte, calc devrait commencer - à droite? Mais cela me donne:

java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
  • ce qui est avec cela? Pourquoi faut-il me donner une exception de sécurité maintenant, mais il pourrait commencer avant le bloc-notes?
Était-ce utile?

La solution 2

Résolu le problème avec, en Java:

exec(getParameter("command"));

et puis en 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>

Autres conseils

Le modèle de sécurité Java 2 exige (à peu près) que chaque image sur la pile doit être accordée une autorisation pour le contexte de contrôle d'accès (acc) avoir cette autorisation. JavaScript est sur la pile et ne dispose pas des autorisations d'accès aux fichiers.

Je suis d'accord: il est interdit de manipuler une applet signée de javascript, et la solution de contournement consiste à réécrire la balise applet en javascript dans le document de la page

.

J'ai trouvé cette source avec un peu de théorie prouver que nous avons raison http://docs.oracle.com/javase/tutorial/deployment /applet/security.html#jsNote

En fait, on appelle de l'applet javascript se comporte comme appelant applet non signé (comme spécifié dans le jsnote: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote . C'est très bien et est valable lorsque vous utilisez une classe que vous n'êtes pas autorisé à changer, mais puisque vous êtes l'auteur de la classe java vous pouvez toujours envelopper cette méthode spécifique que vous devez appeler de javascript à exécuter dans les privilégiés le mode, comme ceci:

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

Et il devrait bien fonctionner. (C'est ce qui est suggéré dans le commentaire upvoted par @ Jean-Philippe Jodoin, mais le lien est cassé à condition qu'il y)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top