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

StackOverflow https://stackoverflow.com/questions/1068271

Вопрос

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

    }

}

По сути, то, что он делает, заключается в том, что он выполняет "notepad 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>

Теперь, когда я нажимаю на этот текст, должен запуститься calc - не так ли?Но это дает мне:

java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
  • что с этим такое?Почему сейчас это выдает мне исключение безопасности, но раньше оно могло запускать notepad?
Это было полезно?

Решение 2

Решил проблему с помощью, на 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>

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top