在公共.net应用程序中使用执行SQL函数是否安全?

时间:2012-05-17 15:16:32

标签: .net sql database linq c#-4.0

我正在计划一个将在C#4.0中构建的程序。我在考虑使用LINQ to SQL,但这是我的问题。因为这个应用程序是公开的,所以任何人都可以对其进行去混淆,并在大约5分钟内在.net反射器中打开它。然后,他们可以轻松地进行更改以转储我的表或插入/删除/更新数据。我知道这是因为我使用这些程序的基本逆向工程技能甚至可以做到。

有没有办法在.net中执行数据库事务,这种事务从上面的内容(或至少更安全)安全可靠。现在我知道你永远不会百分百安全,只有你能做的事情。这是一个非常开放的话题,但我只是在寻找你所做的或知道人们为确保这类的事情。

我只是希望它足够安全,以至于有人需要真正尝试造成伤害,而不是仅仅为全世界打开它。

谢谢!

4 个答案:

答案 0 :(得分:4)

如果您正在寻找一种方法来使您的代码不可读/无法使用Reflector进行检查,那么就没有万无一失的方法。您可以使用代码混淆,但也可以打破。它只是让它变得更难。 (更多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。

在您的情况下,您需要关注的特定做法是最低权限的做法。从我链接的文章:

  

使用最少特权的数据库帐户

     

您的应用程序应使用a连接到数据库   最低权限的帐户。如果您使用Windows身份验证   连接,Windows帐户应该是最低权限的   操作系统的角度来看应该具有有限的权限和   访问Windows资源的能力有限。另外,无论是否   你没有使用Windows身份验证或SQL身份验证   相应的SQL Server登录应受权限限制   数据库。

     

考虑在Microsoft上运行的ASP.NET应用程序的示例   访问其他服务器上的数据库的Windows Server 2003   同一个域名。默认情况下,ASP.NET应用程序在   在网络服务帐户下运行的应用程序池。这个   帐户是权限最低的帐户。

因此,您需要使用最小权限原则设计数据库,这样即使有人对您的应用程序进行反编译,他们也无法做任何恶意的事情。

创建特定用户(或多个用户)并仅向用户提供他们所需的访问权限。需要从表X读取,但不写入它?没问题。只授予它们对表的SELECT权限。不要授予更改,编辑,插入或查看。简而言之,提前计划,知道他们将需要什么权利,并相应地设计数据库。


或者(这不是推荐的方法)从没有权限的用户开始并开发应用程序,随着时间的推移授予权利。这应该在测试/开发DB上完成,而不是生产,如果你遵循良好的安全实践,应该记录,但这是另一个问题。这种方法是有效的,它不是最有纪律的。

如何做到这一点对于ServerFault.com来说更是一个问题,但MSDN provides plenty of guidance if you're using SQL Server和其他数据库系统同样有详细记录。


其他选项包括不提供对数据库的直接访问。使用Web ServicesWCF公开服务器上的服务。客户端只调用公开的函数,并且不了解底层数据库,因此不存在直接访问的风险。我们选择此选项是因为它增强了安全性,使我们无需在数据库发生更改时重新编译和重新部署客户端代码。假设我们想要从SQL Server切换到我们的大型机的DB @数据库(反之亦然)我们只会更改Web服务中的代码,而不是数百个客户端。

然而,即使使用这种方法,您仍然需要将您的服务设计为安全,因此仍需要完成学习。

答案 1 :(得分:0)

即使您的结果.exe对Reflector和类似工具可见,也不意味着必须与数据库建立连接。

如果您有SQL注入漏洞,那就不同了,应该单独修复 - 但是您应该考虑加密数据库交互的方法。

这个问题和相关答案应该给你一个很好的概述: How to configure database connection securely

答案 2 :(得分:0)

如果从应用程序直接连接到数据库,用户可以从app.config获取连接字符串并直接连接到db,甚至不反映您的代码。 当然,您可以加密连接字符串,但是稍微使用反射和调试,无论如何都有人可以提取它。
所以我说你的数据库无论如何都是不受保护的。

您可以通过以下方式保护数据库:放弃数据库(使其成为应用程序本地),安全数据库,而不是应用程序DAL,选择服务方法。

答案 3 :(得分:0)

问题表明你有点忽略了这一点。

如果用户有权访问您的数据库,或某些公共Web服务或任何公共接口,那么您需要某种方式来验证和授权该访问权。

无论攻击者是否知道您的客户端如何工作,该接口都可能受到攻击。保护客户端只会减慢它们的速度。