2012-05-17 22 views
2

我正在計劃一個將在C#4.0中構建的程序。我正在考慮使用LINQ to SQL,但這是我的問題。由於此應用程序是公開的,因此任何人都可以在大約5分鐘的時間內將其去混淆並在.net反射器中打開它。然後,他們可以輕鬆地進行更改以轉儲我的表或插入/刪除/更新數據。我知道這是因爲使用這些程序的基本逆向工程技能,甚至我甚至可以做到。在public .net應用程序中使用執行SQL函數是否安全?

有沒有一種方法可以在.net中執行數據庫事務,這種安全性和安全性可以從上面(或者至少更安全)的東西中獲得。現在我知道你永遠不可能100%安全,只有你可以做很多事情。這是一個相當開放的話題,但我只是在尋找建議,你已經做了什麼或者知道人們爲了保護這種類型事情。

我只是希望它足夠安全,以至於有人需要真正嘗試造成傷害,而不僅僅是讓全世界都看到它。

謝謝!

+0

簽名你的程序集,使他們將無法取代其中的一些和混淆連接字符串到數據庫(我記得這裏有一個關於這個帖子)。 –

+3

或將您的數據圖層移至Web服務。 – hyp

+0

我已經嘗試過,但它並不可悲地工作,反射器有插件刪除沒有問題。然後他們只需進入應用程序就可以編寫代碼,然後重新編譯成一個新的exe。 –

回答

4

如果你正在尋找一種方法,使你的代碼不可讀/不能夠使用反射檢查,沒有防呆方法。你可以使用代碼混淆,但也可以被破壞。這隻會讓它更難一點。 (更多here。)

但是,有一些方法可以構建一個安全的.NET應用程序,不允許用戶惡意影響您的數據庫。幾乎每個.NET應用程序都以某種方式使用數據庫。

你的問題有點寬泛。爲了有效地保護你的數據庫和應用程序,你需要知道危險,知道如何配置你的SQL Server,知道如何防守編碼。你問的很好,但答案並不簡單。真正的答案是「開始研究和學習」。

這聽起來像是你在談論一個WinForms應用程序,而不是.NET,但你要解決的具體漏洞 - SQL注入(或者在這種情況下,SQL篡改,因爲你擔心有人反編譯應用程序) - 兩者都是通用的。就保護數據庫而言,最大的區別在於如何加密.config文件。它在WinForms中略有不同。 Here's an article showing how to do it

防禦性編碼是一個因素。 this article中的課程繼承了WinForms世界,甚至在.NET之外,即使它是面向ASP.NET的。

就你而言,具體練習你需要關注的是最小特權的做法。從文章中,我掛:

使用權限最少的數據庫帳戶

您的應用程序應該使用 最低權限的帳戶連接到數據庫。如果您使用Windows身份驗證至 連接,則Windows帳戶應該從 操作系統角度來看應該是最低權限,並且應具有有限的權限和訪問Windows資源的權限。此外,無論您使用Windows身份驗證還是使用SQL身份驗證, 對應的SQL Server登錄都應該受到數據庫中 的權限限制。

考慮在Microsoft上運行的ASP.NET應用程序的示例 Windows Server 2003在同一個域中訪問不同服務器上的另一臺服務器上的數據庫。默認情況下,ASP.NET應用程序在網絡服務帳戶下運行的 應用程序池中運行。這 帳戶是最低權限的帳戶。

因此,您需要設計具有最小權限原則的數據庫,以便即使有人對您的應用程序進行了反編譯,他們也不能做任何惡意的事情。

創建特定用戶(或多個用戶)並僅爲用戶提供他們需要的訪問權限。需要從表X讀取,但不寫入它?沒問題。只授予他們對錶的SELECT權限。不要授予更改,編輯,插入或查看。總之,提前計劃,知道他們將需要什麼權利,並據此設計數據庫。


或者(這是不推薦的方法),開始了與沒有權利和開發應用程序,授予權利,你走的用戶。這應該在測試/開發數據庫上完成,而不是生產,如果你遵循良好的安全實踐,應該記錄下來,但這是另一個問題。這種方法將起作用,但這不是最有紀律的。

如何做到這一點對於ServerFault.com來說更是一個問題,但MSDN provides plenty of guidance if you're using SQL Server和其他數據庫系統都有相同的記錄。


其他選項包括不提供對數據庫的直接訪問。使用Web ServicesWCF在您的服務器上公開服務。客戶只是調用暴露的函數,並且不知道底層數據庫,所以不存在直接訪問的風險。這個選項是我們採用的選項,因爲它增強了安全性,並防止我們在數據庫發生更改時不必重新編譯和重新部署客戶端代碼。假設我們要從SQL Server切換到大型機的DB @數據庫(反之亦然),我們只需更改Web服務中的代碼,而不是更多的客戶端。

但是,即使使用這種方法,您仍然需要設計您的服務以確保安全,因此學習仍然需要完成。

+0

+1優秀的迴應。不過,我認爲你的意思是[WCF](http://msdn.microsoft.com/en-us/library/ms735119%28v=VS.90%29.aspx)你提到了WPF。 – GarethD

+0

@GarethD謝謝你指出這一點!!!!真是尷尬!現在已經修復了。 – David

+0

感謝您花時間做出如此驚人的迴應。我來這裏學習是因爲這裏有像你這樣的人。作爲一名Jr.軟件開發人員,這非常有幫助! –

0

即使您的結果.exe對Reflector和類似工具可見,但並不意味着您的數據庫連接必須是。

如果你有一個SQL注入漏洞,那是不同的,應該單獨修復 - 但你應該看看如何加密你的數據庫交互。

這個問題和相關答案應該給你一個很好的概述: How to configure database connection securely

+0

那麼連接是安全的,但如果他們看到源代碼,這意味着他們可以編寫自定義函數來說在應用程序啓動時從我的表中刪除信息。使用反射器可以做到這一點沒有問題。這就是爲什麼我需要一種方法來隱藏此代碼以使其更難找到。 –

0

如果你直接連接到應用程序的數據庫,用戶可以從app.config中獲取連接字符串,並直接連接到數據庫,甚至不反映你的代碼。 當然,您可以加密您的連接字符串,但只需稍加反思和調試即可使用,無論如何,有人可以提取它。
所以我會說你的數據庫將不受保護。

您可以通過以下方式來保護數據庫:放棄它(使其成爲本地應用程序),安全數據庫,而不是應用程序DAL,選擇服務方法。

0

這個問題表明你有點缺少重點。

如果用戶有權訪問數據庫,或者訪問某些公共Web服務或訪問任何公共接口,則需要某種方式來驗證和授權訪問。

無論攻擊者是否知道客戶端的工作方式,該接口都會受到攻擊。保護客戶端只能減慢速度。

相關問題