2015-01-20 3 views
2

Я разрабатываю приложение на основе Java Swing, которое использует JDBC для подключения к базе данных MySQL. Таким образом, программное обеспечение напрямую удаляет доступ к базе данных с любого компьютера, на котором он работает. Кроме того, приложение использует подготовленные операторы для запроса базы данных, а база данных размещается на общей учетной записи хостинга CPanel (если это имеет значение).JDBC Remote MySQL Connectivity

Фрагмент кода я использую для подключения к базе данных следующим образом (довольно стандартные подключение код, который я думаю, и все строки во всех колпачках содержат правильное содержание):

String url = "jdbc:mysql://URL:PORT/DB_NAME?connectTimeout=3000"; 
Connection conn = DriverManager.getConnection(url, USERNAME, PASSWORD); 

я только когда-либо успешно использовал приложение с одного IP-адреса. Прежде чем я буду использовать приложение с IP-адреса, мне нужно вручную переустановить IP-адрес, добавив его в качестве разрешенного удаленного узла доступа к MySQL. Если я не добавить IP в качестве разрешенного хоста доступа, сервер отказывается мое соединение, и я получаю результирующую ошибку:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 

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

Эта система будет в порядке, если приложение будет использоваться только с одного IP-адреса, но оно должно работать с любого IP-адреса, поскольку я не могу предсказать, кто его будет загружать и использовать. Единственное решение, которое я вижу, - это сделать глобальный белый список всех IP-адресов в разрешенной зоне доступа хостов MySQL. Тем не менее, похоже, что у него много недостатков, таких как отсутствие безопасности, поскольку любой, у кого есть правильный пароль, может войти в систему (и, таким образом, будет восприимчив к атакам с грубой силой). This, по-видимому, подтверждает гипотезу о том, что этот метод небезопасен. Таким образом, я хотел бы иметь систему связи между приложением и базой данных, которая не зависит от IP (не требует белого списка всех IP-адресов).

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

Я провел некоторое исследование этой проблемы, и мои усилия привели меня к двухуровневым и н-ярусным моделям связи с базой данных. Возможно, я мог бы сделать что-то вроде создания страницы PHP, которая принимает инструкцию и ряд параметров (плюс пароль для ввода записи), выполняет оператор и возвращает результат обратно как JSON. Однако это похоже на еще один метод, отличный от идеала, поскольку, похоже, у него также будут проблемы с безопасностью.

Я уверен, что кто-то более опытный и знающий, чем я, уже столкнулся с этой проблемой и разработал решение.

Поэтому, мой вопрос: какой предпочтительный метод подключения к базе данных MySQL из приложения Java не зависит от IP-адреса?

Я очень благодарен вам за ваше время.

ответ

1

Вы находитесь на правильном пути:

1) Если вы хотите какой-либо произвольный клиент для прямого подключения к базе данных, и клиенты могут иметь любой произвольный IP-адрес ... то вы, вероятно, будете должны быть эффективны disable IP-безопасность - это белый список все Возможные IP-адреса клиентов.

2) С другой стороны, если вы разрешаете локальный доступ к mySql (наиболее распространенный сценарий), вы можете создать веб-приложение для взаимодействия между вашими клиентами и mySql.

ПРЕДЛОЖЕНИЕ: Рассмотрите возможность создания веб-сервиса «ОТДЫХ», с которым могут разговаривать ваши клиенты.

Вот хороший учебник, который может помочь вам начать работу:

REST with Java (JAX-RS) using Jersey - Tutorial

Q: Существует ли в вашей качели приложение действительно нужно излучать «сырой SQL»? Или это может сделать «высокий уровень» запросов? REST идеально подходит для последнего.

PS:

Вот еще один, короткий пример, который может помочь предложить некоторые конструктивные варианты с REST, MySql и Java для вас:

http://www.9lessons.info/2012/09/restful-web-services-api-using-java-and.html

+0

спасибо за совет. Прошу простить мое невежество - что такое «запрос высокого уровня»? В настоящее время он запускает запросы для получения данных (как подробных, так и обобщенных) в различных таблицах в базе данных. Будет ли это считать сырой SQL или запрос высокого уровня? – cryptopi

+0

raw SQL: 'select * from widgets;'. Высокий уровень: 'http: //example.com/rest/widgetreport? Detail'. Также читайте комментарии Олли Джонса ниже. Он прав: открытие mySQL-доступа к другим хостам в сети (или, что еще хуже, любому клиенту в Интернете) открывает целую банку червей. Я выступаю за создание простого «веб-приложения» вместо прямого доступа к mySQL. Я также предполагаю, что создание «REST API» для ваших отчетов может быть эффективным способом сделать это. – FoggyDay

+0

Большое спасибо за отзыв.Если я смогу понять, как писать REST API (я никогда не писал его раньше), я, вероятно, буду (одна из вещей, которые у меня возникают проблемы с пониманием/еще не найдены в учебниках, заключается в том, как добавить безопасность [ пароль] в API, так что только мое приложение может получить к нему доступ). Мне понравилось предложение Олли Джонса использовать SSH-туннель для удаленного доступа к базе данных. Если я могу спросить, на ваш взгляд, что может быть лучше: использовать туннель SSH для удаленного доступа или использовать REST API (потому что я честно не знаю)? – cryptopi

1

Вы против политики - прежде всего политики безопасности - вашего хостинг-провайдера. Обычно считается, что небезопасно разрешать соединения порта 3306 (MySQL) со всего Интернета. Это, безусловно, заставляет ваш сервер MySQL открывать тривиальные атак типа «отказ в обслуживании». (Это просто требует, чтобы какой-то knucklehead контролировал бот-сеть, чтобы отправлять много попыток подключения к порту 3306. Они даже не должны быть успешными попытками подключения.) Если вы делите свой сервер MySQL с другими клиентами вашего хостинг-провайдера, у них есть каждый стимул для ограничения вашего удаленного доступа к их серверу.

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

Вы можете использовать туннелирование SSH для обработки доступа к базе данных. SSH-пакет приложений удаленного доступа позволяет осуществлять переадресацию портов. Чтобы использовать это, вы должны установить (аутентифицированные и зашифрованные) ssh-соединения между компьютерами конечных пользователей и вашей машиной базы данных, которые отправляют порт 3306. Затем ваши пользователи могут подключиться к localhost: 3306, и этот сетевой трафик будет перенаправлен на ваш сервер базы данных. Он довольно гибкий и достаточно безопасный, если не совсем прост в настройке.

Вы также можете исследовать, используя SQL Relay. Он обычно используется для объединения пулов и управления в сети центра обработки данных, но он может работать для этой цели.

Будьте осторожны, открывая свой сервер MySQL миру! Если вы это сделаете, вы можете потребовать использования зашифрованных соединений TLS.