我正在開發一個基於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