署名したアプレットを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();
        }

    }

}

基本的には何で、それが実行'メモ帳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>

今押しこのテキスト、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)の権限を付与する必要があることを(おおよそ)が必要です。 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クラスまでラップする特定のメソッドを呼出す必要があります。からwebブラウザでjavascriptの実行を実行することの特権モードでは、このように:

AccessController.doPrivileged(new PrivilegedAction<String>() {
    @Override
    public String run() {
        exec(command);
        return null;
    }
});

ではokです。(これは何を示唆するのupvotedのコメント@ジャン=フィリップ-Jodoinのリンクが切れ)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top