2008-10-17 1 views
3

Недавно я получил проект hobby java, встроенный в страницу thanks to this very site, но теперь у меня проблемы с безопасностью.Как разрешить Java-апплету использовать MySQL?

У меня есть включают в себя:

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... 

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

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

ответ

2

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

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

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

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

+0

Добавление этого атрибута в HTML-тег работает отлично! Благодаря! И благодаря всем, кто предупреждал о том, как легко получить данные аутентификации с помощью декомпиляции, я подумал, что это может быть проблемой, прежде чем сделать общедоступным приложение, я буду использовать сетевой протокол и делать все SQL-серверы , – 2008-10-19 08:58:43

0

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

+0

Вы правы, мне это не нужно. но он все еще не работает во встроенном апплете. Та же проблема. – 2008-10-17 05:32:57

2

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

1

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

0

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

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

1

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

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

Смежные вопросы