التطبيق الصغير الموقع يعطي AccessControlException:تم رفض الوصول، عند الاتصال من جافا سكريبت

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

سؤال

لدي تطبيق صغير سهل التوقيع ذاتيًا (تم ذلك باستخدام أداة المفاتيح و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>

الآن عندما أضغط على هذا النص، يجب أن يبدأ الحساب - أليس كذلك؟لكن هذا يعطيني:

java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
  • ما الأمر مع هذا؟لماذا يمنحني استثناءً أمنيًا الآن، لكن يمكنه تشغيل المفكرة من قبل؟
هل كانت مفيدة؟

المحلول 2

حل المشكلة مع، في جافا:

exec(getParameter("command"));

ثم في جافا سكريبت:

<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 موجود في المكدس وليس لديه أذونات الوصول إلى الملفات.

أنا موافق :يُحظر التعامل مع التطبيق الصغير الموقّع من جافا سكريبت، والحل البديل هو إعادة كتابة علامة التطبيق الصغير في جافا سكريبت في مستند الصفحة.

لقد وجدت هذا المصدر مع القليل من النظرية التي تثبت أننا على حقhttp://docs.Oracle.com/javase/tutorial/deployment/applet/security.html#jsNote

في الواقع، يتصرف استدعاء التطبيق الصغير من جافا سكريبت باعتباره استدعاء التطبيق الصغير غير الموقع (كما هو محدد في jsnote: http://docs.Oracle.com/javase/tutorial/deployment/applet/security.html#jsNote.هذا أمر جيد وصالح عندما تستخدم فئة لا يُسمح لك بتغييرها، ولكن نظرًا لأنك مؤلف فئة Java، يمكنك دائمًا تغليف تلك الطريقة المحددة التي تحتاج إلى استدعائها من جافا سكريبت ليتم تنفيذها في الامتياز الوضع، مثل هذا:

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

وينبغي أن تعمل بشكل جيد.(هذا هو ما تم اقتراحه في التعليق الذي تم التصويت عليه بواسطة @Jean-Philippe Jodoin ولكن الرابط الموجود هناك معطل)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top