如果你正在尋找一種方法,使你的代碼不可讀/不能夠使用反射檢查,沒有防呆方法。你可以使用代碼混淆,但也可以被破壞。這隻會讓它更難一點。 (更多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 Services或WCF在您的服務器上公開服務。客戶只是調用暴露的函數,並且不知道底層數據庫,所以不存在直接訪問的風險。這個選項是我們採用的選項,因爲它增強了安全性,並防止我們在數據庫發生更改時不必重新編譯和重新部署客戶端代碼。假設我們要從SQL Server切換到大型機的DB @數據庫(反之亦然),我們只需更改Web服務中的代碼,而不是更多的客戶端。
但是,即使使用這種方法,您仍然需要設計您的服務以確保安全,因此學習仍然需要完成。
簽名你的程序集,使他們將無法取代其中的一些和混淆連接字符串到數據庫(我記得這裏有一個關於這個帖子)。 –
或將您的數據圖層移至Web服務。 – hyp
我已經嘗試過,但它並不可悲地工作,反射器有插件刪除沒有問題。然後他們只需進入應用程序就可以編寫代碼,然後重新編譯成一個新的exe。 –