如果您正在寻找一种方法使您的代码不可读/无法使用 Reflector 进行检查,那么没有万无一失的方法。您可以使用代码混淆,但它也可以被破坏。它只会让它变得更难一些。(更多在这里。)
但是,有一些方法可以构建一个不允许用户恶意影响您的数据库的安全 .NET 应用程序。几乎每个 .NET 应用程序都以某种方式使用数据库。
你的问题有点笼统。为了有效地保护您的数据库和应用程序,您需要知道危险,知道如何配置您的 SQL Server,知道如何进行防御性编码。你问的很好,但答案不是一个快速而简单的答案。真正的答案是“开始研究和学习”。
听起来您在谈论的是 WinForms 应用程序,而不是 .NET,但您要解决的特定漏洞 - SQL 注入(或者在这种情况下,可能是 SQL 篡改,因为您担心有人反编译应用程序) - 是两者共有。就保护数据库而言,最大的区别在于如何加密 .config 文件。它在 WinForms 中略有不同。 这是一篇文章,展示了如何做到这一点。
防御性编码是一个因素。本文中的课程适用于WinForms 世界,甚至在 .NET 之外,即使它是面向 ASP.NET 的。
在您的情况下,您需要关注的具体做法是最小特权的做法。从我链接到的文章中:
使用最低权限的数据库帐户
您的应用程序应使用最低权限帐户连接到数据库。如果您使用 Windows 身份验证进行连接,则从操作系统的角度来看,Windows 帐户的权限应该是最低的,并且应该具有有限的权限和访问 Windows 资源的能力。此外,无论您使用Windows身份验证还是SQL身份验证,相应的SQL Server登录都应该受到数据库中的权限的限制。
考虑在 Microsoft Windows Server 2003 上运行的 ASP.NET 应用程序的示例,该应用程序访问同一域中不同服务器上的数据库。默认情况下,ASP.NET 应用程序在网络服务帐户下运行的应用程序池中运行。此帐户是最低特权帐户。
因此,您需要以最小权限的原则来设计数据库,这样即使有人反编译了您的应用程序,他们也不会做任何恶意的事情。
创建一个特定的用户(或多个用户)并只为用户提供他们需要的访问权限。需要从表 X 中读取,但不写入?没问题。只授予他们对表的 SELECT 权限。不要授予更改、编辑、插入或查看权限。简而言之,提前计划,知道他们需要什么权限,并相应地设计数据库。
或者(这不是推荐的方法)从没有权限的用户开始并开发应用程序,并在您进行时授予权限。这应该在测试/开发数据库而不是生产数据库上完成,如果您遵循良好的安全实践,则应该记录在案,但这是另一个问题。这种方法会奏效,只是它不是最自律的。
对于 ServerFault.com 来说,如何做到这一点更多的是一个问题,但如果您使用的是 SQL Server,MSDN 会提供大量指导,并且其他数据库系统也同样有充分的文档记录。
其他选项包括不提供对数据库的直接访问。使用Web 服务或WCF在您的服务器上公开服务。客户端只调用暴露的函数,对底层数据库一无所知,因此不存在直接访问的风险。我们之所以选择此选项,是因为它增强了安全性,并且使我们不必在数据库发生更改时重新编译和重新部署客户端代码。假设我们想从 SQL Server 切换到大型机的 DB@ 数据库(反之亦然),我们只需更改 Web 服务中的代码,而不是数百个客户端中的代码。
但是,即使使用这种方法,您仍然需要将服务设计为安全的,因此仍然需要学习。