Почему мой апплет получает исключение java.security.AccessControlException: доступ запрещен (java.net.SocketPermission ...) и как я могу этого избежать? - PullRequest
17 голосов
/ 13 ноября 2010

Мы не знаем, почему мой клиент обнаружил исключение Java Security в Safari. Может ли кто-нибудь помочь?

Исключение надежно возникает в Safari в Windows. Это включает в себя Java-апплет. Исключение также происходит с Firefox и IE8 в Windows Vista.

Вот шаги для воспроизведения:

  1. Открыть Safari в Windows

  2. Нажмите здесь: http://www.cengraving.com/s/item?itemId=CH003

  3. Нажмите «Настроить» (внизу экрана)

  4. После загрузки страницы «Мгновенное подтверждение» нажмите «Добавить в корзину».

Полная трассировка стека:

java.security.AccessControlException: access denied (java.net.SocketPermission www.cengraving.com resolve)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkConnect(Unknown Source)
    at sun.plugin.security.ActivatorSecurityManager.checkConnect(Unknown Source)
    at java.net.InetAddress.getAllByName0(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at java.net.InetAddress.getByName(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at com.designapplet.a.f.a(Unknown Source)
    at com.designapplet.ui.c.a(Unknown Source)
    at com.designapplet.ui.c.for(Unknown Source)
    at com.designapplet.ui.DesignApplet.buy(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
    at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
java.net.MalformedURLException: no protocol: 
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at sun.plugin.liveconnect.SecureInvocation.checkLiveConnectCaller(Unknown Source)
    at sun.plugin.liveconnect.SecureInvocation.access$000(Unknown Source)
    at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
java.net.MalformedURLException: no protocol: 
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at sun.plugin.liveconnect.SecureInvocation.checkLiveConnectCaller(Unknown Source)
    at sun.plugin.liveconnect.SecureInvocation.access$000(Unknown Source)
    at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)

Ответы [ 8 ]

16 голосов
/ 05 декабря 2011

Вы можете переопределить файл политики безопасности по умолчанию, используемый SecurityManager.

1) Создайте текстовый файл (например, applet.policy)

2) Предоставьте все разрешения апплету

  grant {
   permission java.security.AllPermission;
  };

3) Запустите апплет с

-J-Djava.security.policy=applet.policy
9 голосов
/ 15 декабря 2010

У меня была такая же проблема.И решил это путем самостоятельной подписи апплета ...

использовал следующие шаги, и это сработало

javac AppletClass.java
jar cvf AppletClass.jar AppletClass.class
keytool -genkey -validity 3650 -keystore pKeyStore -alias keyName
keytool -selfcert -keystore pKeyStore -alias keyName-validity 3650
jarsigner -keystore pKeyStore AppletClass.jar keyName

, просто ответьте на вопросы, которые он задаст, и он выполнит работу

ПРИМЕЧАНИЕ: я получаю сообщение об ошибке для локального файла чтения / записи

4 голосов
/ 22 ноября 2010

У меня такая же проблема! JavaScript вызывает открытый метод апплета, который встроен в тот же документ. Это должно привести к тому, что апплет загрузит некоторые данные из «дома», поэтому соединение должно быть открыто в том же домене, откуда был загружен апплет, что должно быть разрешено также для неподписанных апплетов без дополнительных привилегий.

Я также распознал это исключение безопасности только в Safari (5.0.2 для Windows, JRE 1.6.0_22). Один и тот же апплет в IE и FireFox работает хорошо.

Я также считаю, что это ошибка в песочнице Java Safari.


EDIT: Использование doPrivileged не помогло, но я нашел этот обходной путь: Если вы «отделите» вызов JavaScript от запрошенного выполнения с помощью события таймера, выполнение больше не будет запрещено ограничением безопасности, которое Safari вводит в игру здесь. Подробно:

  • метод, который вызывается из JavaScript, создает только javax.swing.Timer (чтобы запланировать одно событие, поэтому для свойства repeat должно быть установлено значение false). Вы можете установить задержку довольно короткой (например, 50 мс).
  • Вызов метода, предназначенный для вызова, должен быть помещен в прослушиватель ActionEvent (actionPerformed), который вызывается таймером.

Одна проблема, которая может усложнить задачу, заключается в том, что в контексте actionPerformed доступны только статические переменные. Если вызов JavaScript содержит переменные, они должны быть изначально вызваны методом в постоянную «буферную» переменную, из которой запланированное событие может впоследствии прочитать значение.

В моих тестах только javax.swing.Timer обеспечивал необходимую развязку, тогда как java.util.Timer не мог использоваться для этой цели.

2 голосов
/ 04 января 2011

Спасибо за ответы.Я не присудил награду, потому что, хотя ответы были полезны, никто не решил проблему.

В конечном счете, я решил проблему, передав данные из апплета на веб-страницу, затем выполнив вызов AJAXобщаться с сервером.Конечно, это не самое элегантное решение, но пока оно оказалось эффективным.

Попробуйте, и позвольте мне знать, работает ли оно для вас.

Еще раз спасибо!

0 голосов
/ 28 марта 2011

JRE-песочница пытается предотвратить вызовы методов, создаваемых javascript, для совершения вредоносных действий, но единственное, что она делает, - это усложняет жизнь программистам.

Лучший обходной путь, который я нашел для этого, - это создать очередь событий шаблонов дизайна производителя и потребителя, которая реализует очень слабую связь между вызовами, исходящими из javascript, и реальной «грязной работой».

Что действительно ужасно, так это то, что код, который отлично работает в XP или Win7, может вызвать исключение в Vista.

0 голосов
/ 17 декабря 2010

В Linux это работает.

Кнопка Add to cart выполняет функцию

  function saveLayout() {

    showSaveMsg();
    var status = document.app.buy();
    var loc = "http://www.cengraving.com/s/cart";

    if (status == 'GOOD') {
      window.location = getCartUrl();
    } else {
      showErrorMsg(status);
    }
  } 

Некоторые замечания:

  • Это нормально, что локальная переменная loc определяется после вызова приложения и все равно не используется?

  • Кроме того, try catch может помочь (в Javascript, оборачивая вызов app.buy()).

  • Кроме того, я провел небольшое исследование в сети, и некоторые люди - с той же ошибкой, но с другим использованием - сообщают о проблеме ClassPath. Есть ли у вас что-то конкретное, что может помешать использованию соответствующей JRE?

0 голосов
/ 15 декабря 2010

Это проявляется как исключение безопасности, но проблема действительно в плохом URL. Если вы проследуете за стеком, вы увидите, что существует исключение MalformedURLE.

Это, скорее всего, вызвано передачей URI где-то, который ожидал URL. Через API LiveConnect, судя по всему. Я предполагаю, что он не находит имя хоста там, где его ожидают, и пытается подключиться к стандартному, возможно, локальному хосту. Это запрещено пока SecurityManager и, следовательно, SecurityException.

В href вы можете использовать URI (например, HREF = "/ somepath"), потому что браузер разрешает это по URL для самой страницы, чтобы получить полный URL (например, http://example.com/somepath).

Вы можете сделать это в Java, используя [соответствующий конструктор URL] [1].

Обновление: Ах, я неправильно понял; Я думал, что это была одна трассировка стека.

Раньше была ошибка, когда liveconnect мог получить доступ к jar: url и получить произвольное соединение с сокетом. Исправление для этого может вызывать проблему с открытием соединений url из потока liveconnect. Что произойдет, если в методе buy вы запустите поток для выполнения соединения?

[1]: http://download.oracle.com/javase/6/docs/api/java/net/URL.html#URL(java.net.URL, java.lang.String)

0 голосов
/ 13 ноября 2010

Это апплет?Если это так, вам нужно подписать свой апплет, чтобы он имел доступ к сокету (что, кажется, то, что вы делаете ...)

См. Здесь для получения дополнительной информации:

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/signed.html

...