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