applet firmato dà AccessControlException: accesso negato, quando si chiama javascript
-
21-08-2019 - |
Domanda
Ho una facile auto-firmato un applet (fatto con keytool e la 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();
}
}
}
In sostanza, ciò che fa, è che si esegue 'notepad c: /hello.txt'.
Poi ho incorporare l'applet in html:
<applet id='applet' name='applet' archive='NetAppletLauncher1.jar' code='src.NetAppletLauncher' width='100' height='100' MAYSCRIPT ></applet>
Quando visito pagina, JRE inizia e mi chiede se voglio iniziare questa applet e se mi fido. Premo ok. Poi notepad inizia - come dovrebbe. Nessun problema qui.
Ma poi aggiungo questo nella pagina HTML:
<p class="link" onclick="document.applet.exec('calc');">remote desktop2</p>
Ora, quando si preme su questo testo, calc dovrebbe cominciare - giusto? Ma questo mi dà:
java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)
at java.security.AccessControlContext.checkPermission(Unknown Source)
- che cosa è con questo? Perché mi dà un'eccezione di sicurezza ora, ma potrebbe avviare Blocco note prima?
Soluzione 2
Risolto il problema con, in Java:
exec(getParameter("command"));
e poi 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>
Altri suggerimenti
Il modello di sicurezza di Java 2 richiede (o meno) che ogni fotogramma sullo stack deve essere concesso un permesso per il contesto di controllo di accesso (acc) per avere quel permesso. JavaScript è in pila e non dispone delle autorizzazioni di accesso ai file.
Sono d'accordo: è vietato manipolare un applet firmato da javascript, e la soluzione è di riscrivere il tag applet in javascript nel documento della pagina
.Ho trovato questa fonte con un po 'di teoria dimostrando abbiamo ragione http://docs.oracle.com/javase/tutorial/deployment /applet/security.html#jsNote
In realtà, chiamando applet da JavaScript comporta come chiamare applet non firmato (come specificato nella jsnote: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote . Questo va bene ed è valido quando si utilizza una classe non è consentito di cambiare, ma visto che sei l'autore della classe Java si può sempre avvolgere che metodo specifico è necessario chiamare da JavaScript da eseguire nella privilegiata modalità, in questo modo:
AccessController.doPrivileged(new PrivilegedAction<String>() {
@Override
public String run() {
exec(command);
return null;
}
});
E dovrebbe funzionare bene. (Questo è ciò che viene suggerito nel commento upvoted da @ Jean-Philippe Jodoin ma il collegamento a condizione che v'è rotto)