Как мне разрешить моему Java-апплету использовать MySQL? - PullRequest
3 голосов
/ 17 октября 2008

Я недавно включил свой java-проект для хобби в страницу , благодаря этому самому сайту , но теперь у меня возникли некоторые проблемы с безопасностью.

У меня есть:

import java.sql.*;

и строка:

Class.forName("com.mysql.jdbc.Driver").newInstance();

, а также файл mysql .jar в моем каталоге src, он работает из консоли, а в апплете работает нормально из апплета - вплоть до той строки forName () в моем коде, где он выдает исключение:

    Exception: com.mysql.jdbc.Driverjava.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.-1)
    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.checkExit(Unknown Source)
    at java.lang.Runtime.exit(Unknown Source)
    at java.lang.System.exit(Unknown Source)
    at applet.Database.connectDB(Database.java:80)
    etc...

Я думаю, что смогу исправить это с помощью файла client.policy, в противном случае мне может понадобиться написать слой абстракции, который использует сетевое соединение сервер-клиент для запроса со стороны сервера ...

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

Ответы [ 6 ]

2 голосов
/ 17 октября 2008

Я думаю, что исключение безопасности на самом деле происходит из вызова System.exit () в вашем апплете, после Class.forName (). Как правило, вы не можете вызывать System.exit () в неподписанных апплетах, так как он закрывает всю JVM. Вы проверили, действительно ли строка 80 является строкой Class.forName (), или в строке 80 есть какой-то обработчик исключений, который пытается вызвать System.exit (), если драйвер не загружается?

В любом случае, чтобы загрузить файл jar mysql в ваш апплет, вам необходимо включить его в атрибут ARCHIVE, например:

<APPLET ARCHIVE="mysql.jar" CODEBASE="./src/" ...

Как только вы пройдете этот этап, вам все равно потребуется разместить сервер mysql с тем же IP-номером / именем хоста, что и веб-сервер, и открыть его для тех же людей, которые могут получить доступ к вашему апплету. Как сказал Тони, это не так, как обычно делают люди из соображений безопасности. Лучше написать что-нибудь на стороне сервера, если у вас есть контроль над сервером приложений, и вы используете XML или другой метод обмена данными для передачи данных в апплет. Конечно, если вы просто экспериментируете, чтобы узнать о апплетах, то это, вероятно, хорошо - но, по возможности, старайтесь держать mysql за брандмауэром.

2 голосов
/ 17 октября 2008

Если вы пытаетесь использовать драйвер JDBC из апплета, тогда апплет должен быть подписан сертификатом, и ваш сервер должен доставить этот сертификат, когда апплет загружен на стороне клиента.

1 голос
/ 17 октября 2008

Как уже упоминалось в одном из других ответов (@Leigh Caldwell), я бы настоятельно рекомендовал бы не поступать таким образом. Если у вашего апплета есть доступ к MySQL, то и у всех остальных в мире. В настоящее время декомпиляция настолько тривиальна, что трудолюбивому хакеру понадобится всего лишь мгновенная попытка получить учетные данные апплета в базе данных. Кроме того, аутентификация user / pass в MySQL довольно слабая, большая часть ее безопасности основана на IP. Открывая его миру, вы отбрасываете свою первую черту почтения.

Лучшим подходом было бы создать некоторый протокол внешнего интерфейса на стороне сервера (XMLRPC был бы хорошей основой и простым в использовании). Если апплету абсолютно необходим доступ к базе данных, лучшим вариантом будет HSQLDB в памяти. Это не требует никаких прав доступа к файлу и может быть запущено полностью в песочнице. При необходимости локальная база данных в памяти может быть синхронизирована с сервером с использованием вышеупомянутого фасада XMLRPC.

1 голос
/ 17 октября 2008

Допустимый способ сделать это - сделать HTTP-запросы на данные с сервера, с которого был загружен апплет, и выполнить запросы с сервера. JSON или XML являются хорошими способами обмена данными между апплетом и сервером (аналогично тому, как вы делаете приложение AJAX, отправляя XML или JSON между браузером и сервером).

0 голосов
/ 17 октября 2008

Исключение говорит вам, что апплету не удалось загрузить класс драйвера. Ваш апплет должен загрузить jar, содержащий класс, во время выполнения по HTTP, поэтому вы должны иметь jar (mysql.jar или как его там), доступный на веб-сервере.

После того, как вы решите эту проблему, пользователь должен будет разрешить разрешения апплета, чтобы он мог устанавливать сокет TCP-соединения с сервером mysql db. Они будут предложены с диалоговым окном ...

0 голосов
/ 17 октября 2008

Попробуйте избавиться от части newInstance(). Я думаю, что наличие Class.forName() делает это для загрузки драйвера.

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