서명 된 애플릿은 AccessControleXception을 제공합니다. Access Denied, JavaScript에서 호출 할 때
-
21-08-2019 - |
문제
쉽게 자체 서명 한 애플릿이 있습니다 (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에서 제안 된 것입니다.