2015-01-20 158 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加密連接。