2010-02-05 142 views
2

我使用的中心MySql數據庫具有許多運行和使用此數據庫的Java客戶端(直接連接)。客戶將公開可用,因此安全性成爲問題。從Java客戶端保護數據庫

由於Java可以反編譯,我不能把這個系統的安全部分放到客戶端應用程序中。我需要一個初始用戶名/密碼才能訪問數據庫,但除此之外,我無法真正保護客戶端中的任何內容,因爲黑客可能只是提取連接數據並編寫他自己的應用程序進行黑客攻擊。

因此,這導致我參數化存儲過程。這將允許我通過將權限限制爲SELECT & EXECUTE來保護數據庫。而且,我正在考慮讓每個SP都有用戶名/密碼參數,因此每次調用SP時都可以驗證用戶權限級別,以防止低級用戶能夠破解/使用管理SP。

這似乎給了一定的安全性,並允許多級訪問數據庫,但後來我到SQL注入。

如果我正在使用參數化SP,如何在SP將它們運行到數據庫之前清除參數?在PhP中這很簡單,但是使用本地運行的Java客戶端,我沒有服務器端應用程序來完成這項工作。我知道我可以在客戶端的數據庫&之間放置某種服務器端應用程序,但是我想盡可能避免這種情況。

這可能實現嗎? 它會是'安全'嗎?

這是正確的方式去解決這個問題,還是有更好的方法來實現這種架構的安全性?

+0

你有沒有聽說過SQL注入?那麼你剛剛提出的將會引入更糟糕的漏洞。 – rook 2010-02-05 15:45:45

+0

如果您閱讀我的文章,我提到了我對SQL注入的擔憂,並詢問是否有方法在處理SQL之前清除(可能)用戶輸入的數據。 – Dave 2010-02-08 10:54:44

回答

5

這是正確的方式去解決這個問題,還是有更好的方法來實現這種架構使用這種安全嗎?

我認爲你需要去三層。您不能將數據庫直接暴露給不受信任的客戶端。您希望應用程序服務器位於兩者之間。最終用戶將登錄到應用程序服務器(理想情況下,爲每個用戶輸入一個單獨的用戶名/密碼,該用戶輸入該用戶名/密碼,但不包含在應用程序中)。只有應用程序服務器連接到數據庫,並且它只做它認爲合適的(如:不直接運行從客戶端獲得的任何類型的SQL,但定義允許的許多方法/查詢)。

如果你仍然想直接從客戶端到數據庫,至少創建個人數據庫用戶帳戶(並沒有硬編碼的密碼)。但是,(適當管理所有權限)可能最終對DBA來說太麻煩了,配置錯誤會導致巨大的安全問題。

+0

當我提出我的問題時,我意識到三層方法,但是,由於多種原因,我真的想避免這種情況。 管理許多賬戶(每個用戶1個賬戶)實現起來會非常困難,尤其是當我希望新用戶無需管理員幫助即可註冊和登錄。即只下載客戶端,並訪問數據庫(作爲最低級別)。用戶等級稍後將由管理員進行調整,通過調整數據庫的用戶表中的字段,允許他們逐步提高功能(從而更多地訪問存儲過程)。 – Dave 2010-02-05 10:01:53

+0

每次調用時的'檢查權限級別'對於數據庫來說都是額外的開銷,但我相信在這種情況下會起作用,但它仍然容易受到SQL注入的攻擊,除非我能找到一種方法來「清理」輸入服務器端這意味着在SP內部。這就是困擾着我,雖然我會承認我可能正在尋找一些我還沒有考慮過的其他安全問題。 – Dave 2010-02-05 10:03:12