подписанный апплет дает AccessControlException: доступ запрещен при вызове из javascript

У меня есть простой самоподписанный апплет (сделанный с помощью keytool и 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();
        }

    }

}

По сути, он выполняет «блокнот c:/hello.txt».

Затем я вставляю апплет в html:

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

Когда я захожу на страницу, JRE запускается и спрашивает меня, хочу ли я запустить этот апплет и доверяю ли я ему. нажимаю ок. Потом блокнот запускается - как надо. Здесь нет проблем.

Но затем я добавляю это на 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)
  • что с этим? Почему сейчас он дает мне исключение безопасности, но раньше он мог запускать блокнот?

person corgrath    schedule 01.07.2009    source источник


Ответы (4)


Модель безопасности Java 2 требует (примерно), чтобы каждому фрейму в стеке было предоставлено разрешение для контекста управления доступом (acc), чтобы иметь это разрешение. JavaScript находится в стеке и не имеет прав доступа к файлам.

person Tom Hawtin - tackline    schedule 01.07.2009
comment
Он также мог бы использовать API AccessController.doPrivileged для повышения привилегий вызова функции javascript до одного из подписанного апплета. inf.puc-rio .br/~роберто/java/jdk1.2/docs/guide/security/ - person Jean-Philippe Jodoin; 05.07.2010
comment
Большое спасибо, это решило мою проблему красивым и чистым способом. - person boxofrats; 11.12.2010

Решил проблему с, в 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>
person corgrath    schedule 01.07.2009

Согласен: запрещено манипулировать подписанным апплетом из javascript, и обходным путем является переписывание тега апплета в javascript в документе страницы.

Я нашел этот источник с небольшим количеством теории, доказывающей, что мы правы http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote

person matter    schedule 15.12.2011

На самом деле вызов апплета из javascript ведет себя как вызов неподписанного апплета (как указано в 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, но предоставленная там ссылка не работает)

person draganstankovic    schedule 28.12.2012
comment
это должен быть лучший ответ! сэкономил мне кучу времени! - person Qianlong; 26.01.2016