miniaplicativo assinado dá AccessControlException: access negado, ao chamar de javascript

Eu tenho um auto-assinado fácil um applet (feito com keytool e o 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 o ‘notepad c: /hello.txt’.

Então eu incorpore o applet em html:

  

Quando eu visito a página, o JRE inicia e pergunta se eu quero iniciar este applet e se eu confiar nele. Eu pressiono ok. Então o bloco de notas começa – como deveria. Nenhum problema aqui.

Mas então eu adiciono isso na página HTML:

  

Agora, quando eu pressionar este texto, o calc deve começar – certo? Mas isso me dá:

 java.security.AccessControlException: access denied (java.io.FilePermission <> execute) at java.security.AccessControlContext.checkPermission(Unknown Source) 
  • O que há com isso? Por que isso me dá uma exceção de segurança agora, mas poderia iniciar o bloco de notas antes?

O modelo de segurança do Java 2 requer que (aproximadamente) todos os frameworks da pilha recebam permissão para que o contexto de controle de access (acc) tenha essa permissão. JavaScript está na pilha e não tem permissions de access a arquivos.

Resolvido o problema com, em Java:

 exec(getParameter("command")); 

e depois em JavaScript:

  

Eu concordo: é proibido manipular um applet assinado do javascript e a solução é rewrite a tag do applet no 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, chamar o applet do javascript se comporta como chamar o miniaplicativo não assinado (conforme especificado no jsnote: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote . Isso é bom e é válido quando você você está usando uma class que você não tem permissão para mudar, mas como você é o autor da class java você sempre pode quebrar esse método específico que você precisa chamar de javascript para ser executado no modo privilegiado, como este:

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

E isso deve funcionar bem. (Isto é o que é sugerido no comentário upvoted por @ Jean-Philippe Jodoin mas o link fornecido há quebrado)

    Intereting Posts