В чем разница между http://localhost:8000/ и http://127.0.0.1:8000/ для апплетов Java - PullRequest
3 голосов
/ 04 июля 2011

У меня есть вопрос / проблема, связанная с безопасностью Java-апплета ...
Я использую апплет, который должен принимать файлы с сервера (ASP.NET) и представлять информацию с него. Апплет принимает файлы, используя код:

URL u = new URL(getCodeBase(), filename);
BufferedReader d = new BufferedReader(new InputStreamReader(u.openStream()));

Этот код появляется в двух местах:

  1. Init() метод
  2. Какой-то другой метод Test(), который вызывается вручную из JavaScript

Итак, когда я пытаюсь загрузить страницу с помощью апплета, используя URL http://127.0.0.1:8000/Test.aspx, все работает нормально, и я могу прочитать содержимое файла обоими методами. Но если я изменю URL на http://localhost:8000/, только первый метод будет работать правильно, и я смогу получить содержимое файлов, а для второго я получу следующее сообщение об ошибке в JavaConsole:

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

Какая разница в этом случае? Почему «localhost» невозможен в этом случае? Есть ли способ предоставить доступ к localhost так же, как 127.0.0.1?

Вот пример простейшего апплета:

public class TestApplet extends Applet {

    public void init()
    {
        System.out.println( "init...");

        readDocument();
    }

    public void readDocument()
    {
        System.out.println( "read test.txt file...");

        URL base = getCodeBase();
        String filename = "test.txt";
        try {
            URL u = new URL(base, filename);
            BufferedReader d = new BufferedReader(new InputStreamReader(u.openStream()));
            System.out.println(d.readLine());
            System.out.println("Done!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

и следующий код, используемый на стороне клиента:

<applet archive="/Content/test.jar" code="test.TestApplet.class" name="testApplet" mayscript></applet>

<script language="javascript" type="text/javascript">
    $(document).ready(function () {
        var testApplet = document.testApplet;
        testApplet.readDocument();
    });
</script>

этот код отлично работает, когда я пытаюсь использовать http://127.0.0.1:8000/Test.aspx и не работает, когда я пользуюсь http://localhost:8000/Test.aspx. Я консоль Java Я вижу следующее:

init...
read test.txt file...
some text...
Done!
read test.txt file...
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:8000 connect,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.plugin2.applet.Applet2SecurityManager.checkConnect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.<init>(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.getInputStream(Unknown Source)
    at java.net.URL.openStream(Unknown Source)
    at test.TestApplet.readDocument(TestApplet.java:30)
    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.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.JSClassLoader.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass$MethodInfo.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass$MemberBundle.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass.invoke0(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass.invoke(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$DefaultInvocationDelegate.invoke(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo.doObjectOp(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

P.S .: Апплет подписан.

Ответы [ 3 ]

3 голосов
/ 05 июля 2011

Проблема в вызове из JavaScript.Если вы используете JavaScript для вызова своего метода, разрешения вызова сводятся к пересечению разрешений моста JavaScript (т.е. ничего) и разрешений вашего собственного кода - даже если ваш собственный код подписан.

Чтобы избежать этого и использовать полные привилегии кода вашего апплета, поместите части, относящиеся к безопасности, в вызов AccessController.doPrivileged(...).(Конечно, ваш апплет должен сначала проверить, что он не может сделать ничего вредоносного.)

Я понятия не имею, почему он работает, если вы используете IP-адрес напрямую вместо localhost, хотя.

2 голосов
/ 04 июля 2011

localhost является псевдонимом для 127.0.0.1 , поэтому вам, возможно, придется установить / исправить его в своей среде.Под Windows вы должны отредактировать файл C: \ Windows \ System32 \ drivers \ etc \ hosts .

0 голосов
/ 04 июля 2011

localhost обычно разрешается как ::1, так и 127.0.0.1, а OS / libc обычно настраивается таким образом, чтобы IPv6 был предпочтительным в этих обстоятельствах.

Следовательно, вероятно, вы разрешаете только 127.0.0.1, а не соединения IPv6 из ::1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...