Доступ запрещен (java.net.SocketPermission 127.0.0.1:8080 connect, resolve)

У меня есть Java-апплет, вставленный на простой HTML-странице, расположенной в http://localhost:8080/index.html:

<applet id="applet" code="SomeCode.class" archive="lib.jar" Width="1" Height="1"></applet>

Java-апплет имеет метод, похожий на приведенный ниже код:

public void PostStuffToServer() {
  String server = "http://localhost:8080/PostHandler.ashx";
  URL u = new URL(server);
  URLConnection con = u.openConnection();
  con.setDoOutput(true);
  con.getOutputStream().write(stream.toByteArray());
  con.connect();
}

Когда я запускаю код апплета из JavaScript следующим образом:

obj = document.getElementById('applet');
obj.getClipboardImageURL();

Я получаю следующую ошибку:

доступ запрещен (java.net.SocketPermission 127.0.0.1:8080 подключиться, разрешить)

Кажется, что Java-код разрешает домен localhost эквивалентному IP-адресу и, следовательно, повышает уровень безопасности междоменной безопасности. Он отлично работает, когда я выполняю тот же код из http://127.0.0.1:8080/index.html. Файл lib.jar подписан.

Во всяком случае, чтобы избежать этого?

Ответ 1

Я столкнулся с той же проблемой после установки Java 6 Update 22. Мой аплет был в сети в течение нескольких лет без сообщений об ошибках. Когда я понижаюсь до версии 6 Update 21, все работает отлично. Мой апплет не подписан.

РЕШЕНИЕ: Мне потребовалось, чтобы найти причину проблемы. Фактически в моем случае было несколько факторов, вызывающих ошибку безопасности. Проблема была решена с помощью файла crossdomain.xml. Java-апплет попытался загрузить файл crossdomain, не удалось, и даже не потрудился отображать ошибку в консоли java (уровень отладки 5). Java попыталась загрузить файл из ip-адреса моего домена (http://ip-address/crossdomain.xml), а не корневого сайта моего сайта (http://domain-name/crossdomain.xml). Думаю, это лучше для аспекта безопасности? Затем мне пришлось настроить веб-сервер, чтобы открыть crossdomainfile по IP-адресу. В моем случае я удалил веб-сайт по умолчанию в ISS по соображениям безопасности и должен был создать новый веб-сайт. Затем я обнаружил, что java-апплет не работает с файлами crossdomain, которые я использую со вспышкой:

<?xml version="1.0"?>
<cross-domain-policy>
   <site-control permitted-cross-domain-policies="master-only"/>
   <allow-http-request-headers-from domain="*" headers="*"/>
   <allow-access-from domain="*" />
</cross-domain-policy>

Мне пришлось удалить узлы управления сайтом и allow-http-request-headers из узлов из xml файла, чтобы заставить апплет работать.

Ответ 2

Я думаю, что я слишком поздно, но так или иначе... Ребята, вы не можете поверить, насколько легко решить эту проблему.

Проблема в том, что код Java-апплета, вызываемый из JavaScript, имеет только разрешения, являющиеся пересечением кода JavaScript и вашего кода апплета, - и, как-то, разрешения JavaScript рассматриваются как меньше, что приводит к этому Исключению.

Вот что я сделал: предположим, что у вас есть функция innocentFunc(), которая выдает исключение java.net.SocketPermission, поэтому ваш код выглядит примерно так:

String s = innocentFunc();

Теперь вы можете изменить его на что-то вроде этого:

String s = AccessController.doPrivileged(
      new PrivilegedAction<String>() {
          public String run() {
              return innocentFunc();
          }
        }
     );

Этот вызов AccessController в основном указывает на виртуальную машину Java, что выполняемый код не должен подчиняться разрешениям из цепочки вызовов, а скорее только разрешениям вызывающего абонента.

Конечно, вы должны сделать что-то подобное, только убедившись, что этот вызов innocentFunc не может сделать ничего плохого, даже если он вызван вредоносным кодом.

Ответ 3

Я получаю то же самое с Update 22, а не Update 21.

Я использую TinyPlayer апплет, который я контролирую с помощью JavaScript.

Я загружаю аудиофайлы из одного домена (mydomain.example.com, IP 1.2.3.4) в качестве страницы, на которую загружается апплет - все ссылается на относительные URL-адреса.

Когда я пытаюсь воспроизвести звук, он не воспроизводится, и я получаю: доступ запрещен (java.net.SocketPermission 1.2.3.4:80 подключиться, разрешить)

Глядя на журналы доступа, я получаю запрос на crossdomain.xml прямо перед этим. Но уловка в том, что Java не запрашивает crossdomain.xml от mydomain.example.com/crossdomain.xml ... но вместо этого 1.2.3.4/crossdomain.xml

Обходной путь, который, кажется, работает для меня, - это настроить виртуальный хост, который отвечает за IP-адрес 1.2.3.4, и предоставить ему crossdomain.xml, чтобы Java могла найти crossdomain.xml в (неправильном) место, которое оно ищет.

Я просто тестировал содержимое:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="*" />
</cross-domain-policy>

... но это возможно сделать это более ограничительным.

При этом звук воспроизводится правильно.

Ответ 4

Просто добавьте здесь кое-что, что точно соответствует проблеме, которую я получаю - она ​​специально упоминает управление апплетом с помощью JavaScript.

http://www.oracle.com/technetwork/java/javase/6u22releasenotes-176121.html

Исправление для CVE-2010-3560 может привести к некоторые апплеты Java, работающие в новый Java Plug-in, чтобы прекратить работу, если они встроены в веб-страницы, которые содержать JavaScript, который вызывает Java для выполнения действий, которые требуют разрешения сетевой безопасности. Эти апплеты могут выйти из строя с помощью сети исключение безопасности обстоятельства, если служба имен который разрешил исходную веб-страницу Имя хоста URL не возвращает совпадающее имя в результате обратный поиск адреса.

Их предложение состоит в том, чтобы добавить специальную сумасшедшую запись Just-for-Java в DNS, например:

10.11.12.13    foo.bar.com.auth.13.12.11.10.in-addr.arpa

Ответ 5

IIRC, политика одинакового происхождения JavaScript предотвращает доступ к тому же хосту/другому порту. PlugIn LiveConnect применяет эту политику только для локального хоста.

Ответ 6

Смотрите: http://download.oracle.com/javase/tutorial/deployment/applet/security.html

Неподписанные апплеты могут выполнять следующие операции:

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

Если Java не разрешает исходную систему на localhost, апплет не сможет открывать сокеты.

Ответ 7

У меня была аналогичная проблема, и это происходит только тогда, когда я использую "localhost" в качестве части URL-адреса страницы с апплетом. Когда я использовал URL-адрес с фактическим именем хоста или IP-адресом в качестве части URL-адреса, проблемы не произошло. Я не уверен, что это дефект для плагина Java...

Например, когда я использовал URL-адрес, например http://localhost:9080/app_id/appletPage, возникла проблема, но когда я использую URL-адрес, используя фактическое имя IP или хоста, проблема не возникала.

Ответ 9

Вы должны проверить разрешения виртуального каталога.

Ответ 10

Обновление от @Kristian выше спасло мой день.

У меня был access denied (java.net.SocketPermission <server_ip>:<server port> connect,resolve) из апплета в веб-приложении.

В нашем DNS произошли изменения, так что IP-адрес балансира нагрузки сервера приложений не разрешал имя с доменом. Поэтому подозрительное "междоменное соединение" с апплета на сервер блокировалось. Я добавил crossdomain.xml с

<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy>

до <tomcat-home>/webapps и проверил, что он доступен с помощью http://<server name>:<server port>/crossdomain.xml