我正在开发一个基于Java Swing的应用程序,它使用JDBC连接到MySQL数据库。因此,软件可以从正好运行的任何计算机上直接远程访问数据库。此外,该应用程序使用预准备语句来查询数据库,数据库托管在共享的CPanel托管帐户上(如果这很重要)。
我用来连接数据库的代码片段如下(我认为相当标准的连接代码,所有大写字母中的所有字符串都包含正确的内容):
String url = "jdbc:mysql://URL:PORT/DB_NAME?connectTimeout=3000";
Connection conn = DriverManager.getConnection(url, USERNAME, PASSWORD);
我只使用过一个IP的应用程序。在我从IP使用应用程序之前,我必须通过将IP添加为允许的远程MySQL访问主机来手动将IP列入白名单。如果我不将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进行全局白名单。然而,这似乎有许多缺点,例如不安全,因为任何拥有正确密码的人都可以登录(并因此容易受到暴力攻击)。 This似乎证实了这种方法不安全的假设。因此,我希望在应用程序和数据库之间建立一个独立于IP的系统(不需要将所有IP列入白名单)。
此外(我不知道这是否有意义或重要),但我相信我希望应用程序的某些区域可用于阻止某些协议。因此,(我认为)如果选择的通信方法仅使用HTTP或其他一些广泛使用的协议,我希望如此。
我对这个问题进行了一些研究,我的努力使我进入了2层和n层的数据库通信模型。也许我可以做一些事情,比如创建一个接受语句和一系列参数的PHP页面(加上一个密码来获取条目),执行语句,然后将结果返回为JSON。然而,这似乎是另一种不太理想的方法,因为它似乎也会有安全问题。
我确信有人比我已经遇到过这个问题更有经验和知识,并制定了解决方案。
因此,我的问题是:以独立于IP的方式从Java应用程序连接到MySQL数据库的首选方法是什么?
我非常感谢并感谢您的时间。
答案 0 :(得分: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
答案 1 :(得分:1)
您违反了托管服务提供商的政策(主要是安全政策)。通常认为允许来自整个互联网的端口3306(MySQL)连接不安全。它肯定会让您的MySQL服务器受到琐碎的拒绝服务攻击。 (只需要一些控制僵尸网络的傻瓜来发送大量的端口3306连接尝试。他们甚至不必成功连接尝试。)如果你与你的托管服务提供商的其他客户共享你的MySQL服务器,他们有限制远程访问服务器的所有动机。
构建数据库应用程序以在公共互联网上部署的大多数人通过提供Web服务来使用应用程序所需的特定操作来访问数据库。然后,在最终用户的计算机上部署的应用程序使用HTTP(或HTTPS作为安全性)来访问这些Web服务。反过来,Web服务访问数据库。这就是多层运营所做的。你是对的,存在安全问题,但你可以通过仔细开发你的网络服务代码来缓解这些问题。
您可以使用SSH隧道来处理数据库访问。 SSH远程访问应用程序套件允许端口转发。要使用它,您将在最终用户的计算机和数据库计算机(转发端口3306)之间建立(经过身份验证和加密)的ssh连接。然后您的用户可以连接到localhost:3306,并且该净流量将转发到您的数据库服务器它非常灵活且非常安全,如果不是很简单的配置。
您也可以使用SQL Relay进行调查。它通常用于数据中心网络中的连接池和管理,但它可能用于此目的。
小心打开你的MySQL服务器到世界各地!如果您这样做,您可能需要使用TLS加密连接。