Pregunta

Tengo una autofirmado fácil un applet (hecho con la herramienta de claves y 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();
        }

    }

}

Básicamente, lo que hace, es que se ejecuta 'notepad c: /hello.txt'.

A continuación, lo integrar el applet en HTML:

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

Cuando me visitar la página, JRE se inicia y me pregunta si quiero iniciar este applet y si confío en ella. Me pulse OK. A continuación, inicia el bloc de notas - como debería. No hay problema aquí.

Pero entonces agrego esto en la página HTML:

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

Ahora cuando pulso sobre este texto, Calc debe empezar - a la derecha? Pero esto me da:

java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
  • cuál está para arriba con esto? ¿Por qué me dan una excepción de seguridad ahora, pero podría comenzar el bloc de notas antes?
¿Fue útil?

Solución 2

Resuelto el problema, en Java:

exec(getParameter("command"));

y luego 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>

Otros consejos

El modelo de seguridad de Java 2 requiere (más o menos) que cada fotograma de la pila se debe conceder un permiso para que el contexto de control de acceso (ACC) para tener ese permiso. JavaScript está en la pila y no tiene permisos de acceso a archivos.

Estoy de acuerdo: está prohibido manipular un applet firmado desde JavaScript, y la solución es volver a escribir la etiqueta applet en javascript en el documento de página

.

He encontrado esta fuente con un poco de teoría que demuestra que tenemos razón http://docs.oracle.com/javase/tutorial/deployment /applet/security.html#jsNote

En realidad, llamando applet desde Javascript se comporta como llamar subprograma sin signo (como se especifica en el jsnote: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote . Eso está muy bien y es válido cuando se está utilizando una clase que no se le permite cambiar, pero ya que usted es el autor de la clase Java siempre se puede concluir que el método específico que necesita para llamar desde javascript para ser ejecutado en los privilegiados el modo, como este:

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

Y que debería funcionar bien. (Esto es lo que se sugiere en el comentario upvoted por @ Jean-Philippe Jodoin pero el enlace siempre que no se rompe)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top