2015-01-20 196 views
2

我正在开发一个基于Java Swing的应用程序,它使用JDBC连接到MySQL数据库。因此,该软件可以从正在运行的任何一台计算机直接远程访问数据库。此外,应用程序使用准备好的语句来查询数据库,并且数据库托管在共享的CPanel托管帐户(如果有的话)。JDBC远程MySQL连接

的代码,我用它来连接到数据库的代码片段如下(相当标准的连接代码,我想,在全部大写的所有字符串包含正确的内容):

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工作,因为我无法预测谁将下载并使用它,所以此系统可以正常工作。我看到的唯一解决方案就是在允许的MySQL访问主机区域中创建一个包含所有IP的全局白名单。然而,这似乎有许多缺点,比如不安全,因为任何拥有正确密码的人都可以登录(并且因此容易受到暴力攻击)。似乎证实了该方法不安全的假设。因此,我希望在应用程序和独立于IP的数据库之间建立一个通信系统(不需要将所有IP列入白名单)。

此外(我不知道这是否有意义或重要),但我相信一些区域我希望应用程序用于阻止某些协议。因此,(我认为)如果所选择的通信方法只使用HTTP或其他广泛使用的协议,我希望它。

我对这个问题做了一些研究,我的努力使我成为了数据库通信的2层和n层模型。也许我可以做一些事情,比如创建一个PHP页面,它接受一个语句和一系列参数(加上密码以获得输入),执行语句,然后将结果作为JSON返回。但是,这似乎是另一种不太理想的方法,因为它似乎也会有安全问题。

我确定有人比我更有经验和知识的人已经遇到了这个问题并开发了一个解决方案。

因此,我的问题:以独立于IP的方式从Java应用程序连接到MySQL数据库的首选方法是什么?

我非常感谢,并感谢您的时间。

回答

1

你在正确的轨道上:

1)如果你想任意客户端直接连接到数据库,并且客户端可以有任意IP地址......那么你很可能会必须有效地禁用 IP安全白名单全部可能的客户端IP地址。 2)另一方面,如果您只允许本地访问mySql(到目前为止最常见的情况),那么您可以创建一个Web应用程序来连接您的客户端和mySql。

建议: 请考虑创建一个客户可以与之通话的“REST”Web服务。

这里有一个很好的教程,可以帮助您入门:

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

问:你的Swing应用程序确实需要发出“原始SQL”?或者它可以进行“高级别”查询? REST非常适合后者。

PS:

这里的另一个简单的例子,可能有助于发现一些设计方案与REST中,MySQL和Java为您提供:

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

+0

感谢您的意见。请原谅我的无知 - 什么是“高级查询”?目前,它运行查询以获取数据库中各种表上的数据(包括详细数据和汇总数据)。这会算作原始SQL还是高级查询? – cryptopi 2015-01-20 23:27:10

+0

原始SQL:'select * from widgets;'。高级别:'http://example.com/rest/widgetreport?详细'。另请阅读Ollie琼斯的评论如下。他是对的:向网络上的其他主机(或者更糟糕的是,对互联网上的任何客户端)开放mySQL访问会打开一堆蠕虫。我主张编写一个简单的“Web App”,而不是直接访问mySQL。我还建议为报告创建一个“REST API”可能是实现这一目标的有效方法。 – FoggyDay 2015-01-21 02:29:39

+0

非常感谢您的反馈。如果我能弄清楚如何编写一个REST API(我从来没有写过一个),我可能会(我在教程中遇到困难/还没有找到的其中一件事是如何增加安全性[密码]到API,所以只有我的应用可以访问它)。我喜欢Ollie Jones建议使用SSH隧道来远程访问数据库。如果我认为可能会更好些:使用SSH隧道进行远程访问或使用REST API(因为我真的不知道)? – cryptopi 2015-01-21 04:29:57

1

你面对的政策 - 主要是安全策略 - 您的托管服务提供商。它通常被认为是不安全的,以允许来自整个互联网的端口3306(MySQL)连接。它肯定会让你的MySQL服务器面临微不足道的拒绝服务攻击。 (这只需要一些控制僵尸网络的指头来发送大量端口3306连接尝试,他们甚至不需要成功连接尝试。)如果您与您的托管服务提供商的其他客户共享您的MySQL服务器,他们有每一项限制您远程访问服务器的动机。

大多数构建数据库应用程序以供在公共互联网上部署的人员通过提供Web服务来按照应用程序所需的特定操作来访问数据库。部署在最终用户机器上的应用程序然后使用HTTP(或HTTPS用于安全性)来访问这些Web服务。 Web服务依次访问数据库。这就是多层操作所要做的。你说得对,有安全问题,但你可以通过仔细开发Web服务代码来缓解它们。

您可以使用SSH隧道来处理您的数据库访问。 SSH套件的远程访问应用程序允许端口转发。要使用它,你需要在最终用户的机器和你的数据库机器之间建立(认证和加密的)ssh连接,然后转发3306端口。然后你的用户可以连接到localhost:3306,并且网络流量将被转发到你的数据库服务器如果不是完全简单的配置,它非常灵活和相当安全。

您也可以使用SQL Relay进行调查。它通常用于数据中心网络中的连接池和管理,但可能适用于此目的。

小心将MySQL服务器向全世界开放!如果你这样做,你可能想要求使用TLS加密连接。