miniaplicativo assinado dá AccessControlException: acesso negado, ao chamar de javascript
-
21-08-2019 - |
Pergunta
Eu tenho uma auto-assinado fácil um applet (feito com keytool ea 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();
}
}
}
Basicamente, o que ele faz, é que ele executa 'bloco de notas c: /hello.txt'.
Então eu incorporar o applet em html:
<applet id='applet' name='applet' archive='NetAppletLauncher1.jar' code='src.NetAppletLauncher' width='100' height='100' MAYSCRIPT ></applet>
Quando eu visitar a página, JRE começa e me pergunta se eu quero começar este applet e se eu confiar nele. Eu pressionar ok. Então bloco de notas é iniciado - como deveria. Nenhum problema aqui.
Mas então eu adicionar esta na página HTML:
<p class="link" onclick="document.applet.exec('calc');">remote desktop2</p>
Agora, quando eu pressionar sobre este texto, calc deve começar - certo? Mas isso me dá:
java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)
at java.security.AccessControlContext.checkPermission(Unknown Source)
- O que está acima com este? Por que isso me dá uma exceção de segurança agora, mas poderia começar bloco de notas antes?
Solução 2
Resolvido o problema com, em Java:
exec(getParameter("command"));
e depois em 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>
Outras dicas
O modelo de segurança Java 2 requer (aproximadamente) que cada quadro na pilha deve ser concedida uma permissão para o contexto de controle de acesso (ACC) para ter essa permissão. JavaScript é na pilha e não tem permissões de acesso a arquivos.
Eu concordo:. É proibido manipular um applet assinado de javascript, e a solução alternativa é reescrever a tag applet em javascript no documento da página
Eu encontrei esta fonte com um pouco de teoria provando que estamos certos http://docs.oracle.com/javase/tutorial/deployment /applet/security.html#jsNote
Na verdade, chamando applet do comporta javascript como chamar sem assinatura miniaplicativo (conforme especificado no jsnote: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote . Isso é bom e é válido quando você estiver usando uma classe que não estão autorizados a mudança, mas já que você é o autor da classe java você pode sempre envolver esse método específico que você precisa para chamar de javascript para ser executado no privilegiada modo, como este:
AccessController.doPrivileged(new PrivilegedAction<String>() {
@Override
public String run() {
exec(command);
return null;
}
});
E ele deve funcionar ok. (Isto é o que é sugerido no comentário upvoted por @ Jean-Philippe Jodoin mas o link fornecido não está quebrado)