2009-07-01 43 views
4

打電話時,我有一個簡單的自簽名的小應用程序(使用keytool和的jarsigner完成):簽名的小給人的AccessControlException:拒絕訪問,從JavaScript

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(); 
     } 

    } 

} 

基本上,它做什麼,是它執行'記事本c:/hello.txt'。

然後我嵌入的小程序在HTML:

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

當我訪問的頁面,JRE啓動,並問我,如果我要開始這個小程序,如果我信任它。我按OK。然後記事本開始 - 就像它應該。這裏沒問題。

但後來我加入到HTML頁面這樣的:

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

現在,當我按下這個文本,鈣應該開始 - 對嗎?但是,這給了我:

java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
  • 什麼用這個嗎?爲什麼它現在給我一個安全例外,但它可以在以前開始記事本?

回答

5

解決的問題,在Java:

exec(getParameter("command")); 

,然後在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> 
6

Java 2安全模型要求(大致)堆棧中的每個幀必須被授予訪問控制上下文(acc)的權限才能擁有該權限。 JavaScript在堆棧中,並沒有文件訪問權限。

+3

他也可以使用AccessController.doPrivileged API將 javascript函數調用的權限提升爲1簽名的小程序。 http://www.inf.puc-rio.br/~roberto/java/jdk1.2/docs/guide/security/doprivileged.html – 2010-07-04 22:36:39

+0

非常感謝,這解決了我的問題,一個很好,乾淨的方式。 – boxofrats 2010-12-11 01:21:08

1

其實,從JavaScript調用的小程序的行爲與調用簽名Applet(如jsnote規定: 即罰款和有效http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote。當你使用一個類時,你是不允許改變的,但是因爲你是java類的作者,你總是可以包裝你需要從javascript調用的特定方法在特權模式下執行,如下所示:

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

它應該可以正常工作。 (這是由@Jean-Philippe Jodoin提供的最新評論中提出的建議,但提供的鏈接已損壞)

相關問題