4

私は簡単な自己署名アプレットを持っています(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ページに追加します:

<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)
  • これはどうしたの?なぜ今セキュリティ例外が発生するのに、以前にメモ帳を起動できたのですか?
4

4 に答える 4

6

Java 2 セキュリティー・モデルでは、アクセス制御コンテキスト (acc) がそのパーミッションを持つためには、スタック上のすべてのフレームにそのパーミッションが (大まかに) 付与されている必要があります。JavaScript はスタック上にあり、ファイル アクセス許可がありません。

于 2009-07-01T11:39:02.500 に答える
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>
于 2009-07-01T12:01:14.950 に答える
1

実際、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による賛成のコメントで提案されているものですが、そこに提供されているリンクは壊れています)

于 2012-12-28T23:23:08.470 に答える
1

同意します: 署名されたアプレットを JavaScript から操作することは禁止されています。回避策は、ページ ドキュメント内のアプレット タグを JavaScript で書き換えることです。

私たちが正しいことを証明する少しの理論でこのソースを見つけました http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote

于 2011-12-15T15:15:49.677 に答える