我正在开发一个基于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数据库的首选方法是什么?
我非常感谢,并感谢您的时间。
感谢您的意见。请原谅我的无知 - 什么是“高级查询”?目前,它运行查询以获取数据库中各种表上的数据(包括详细数据和汇总数据)。这会算作原始SQL还是高级查询? – cryptopi 2015-01-20 23:27:10
原始SQL:'select * from widgets;'。高级别:'http://example.com/rest/widgetreport?详细'。另请阅读Ollie琼斯的评论如下。他是对的:向网络上的其他主机(或者更糟糕的是,对互联网上的任何客户端)开放mySQL访问会打开一堆蠕虫。我主张编写一个简单的“Web App”,而不是直接访问mySQL。我还建议为报告创建一个“REST API”可能是实现这一目标的有效方法。 – FoggyDay 2015-01-21 02:29:39
非常感谢您的反馈。如果我能弄清楚如何编写一个REST API(我从来没有写过一个),我可能会(我在教程中遇到困难/还没有找到的其中一件事是如何增加安全性[密码]到API,所以只有我的应用可以访问它)。我喜欢Ollie Jones建议使用SSH隧道来远程访问数据库。如果我认为可能会更好些:使用SSH隧道进行远程访问或使用REST API(因为我真的不知道)? – cryptopi 2015-01-21 04:29:57