서명 된 애플릿은 AccessControleXception을 제공합니다. Access Denied, 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();
        }

    }

}

기본적으로, 그것이하는 일은 '메모장 c : /hello.txt'를 실행한다는 것입니다.

그런 다음 html에 애플릿을 포함 시켰습니다.

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

페이지를 방문 할 때 JRE가 시작 하여이 애플릿을 시작하고 싶은지, 신뢰하는지 묻습니다. 나는 OK를 누릅니다. 그런 다음 메모장이 시작됩니다. 여기에 문제가 없습니다.

그러나 나는 이것을 HTML-PAGE에 추가합니다.

<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)
  • 이게 무슨 일이야? 왜 지금 나에게 보안 예외가 제공되지만 이전에 메모장을 시작할 수 있습니까?
도움이 되었습니까?

해결책 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 (Access Control Context)에 대한 권한을 부여해야합니다. 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의 Upvoted Comment에서 제안 된 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top