连接ASP.NET到SQL Server的最佳实践

8
我们有一个ASP.NET 4.0 Web应用程序,它连接到一个位于局域网另一台机器上的SQL Server。我在Web.config中使用ConnectionString(使用SQL Server身份验证)来实现这一点。基本上,这是一种相当传统的Web服务器到SQL的策略。
然而,我们的一个客户认为这种策略不安全。该客户说我们应该只通过单独的Web服务层连接到SQL Server。
我真的不想重写这个应用程序来满足这个客户。我该怎么告诉他?有没有人知道我如何最好地反驳这个观点?
先谢谢了...

你的客户所说的“安全”,是指什么? - Vano Maisuradze
3层架构 vs 2层架构 - zimdanen
你在设计应用程序时,有哪些考虑因素决定了采用两层架构? - zimdanen
我认为他绝对不希望在LAN上使用非本地SQL连接。他要我编写一个Web服务层,在SQL Server上运行,并通过服务层使我们的ASP.NET应用程序与数据库通信。我认为这是过度杀伤力的。 - Ash8087
顺便说一句,这是一个非常好的链接。谢谢。 - Ash8087
1
使用 Web 服务连接数据库或者换句话说,将所有业务逻辑放到 Web 服务上对于分布式系统来说是理想的,但对于安全性来说则不然。我知道的是,如果有人能够入侵你现有的系统架构,他也可以入侵你的 Web 服务。 - Emad Mokhtar
8个回答

11

安全性总是需要做出权衡。客户真正担心的是什么?

是否担心数据库凭据“明文”存储?我曾见过审计员指出这是一个潜在的漏洞,但实际上,如果有人入侵了你的Web服务器,他们可以对数据库运行任意代码,因此加密数据库凭据并没有太大的作用。

您的Web应用程序应该使用最少权限用户连接到数据库,因此入侵Web服务器只应给您读取和更新数据的权限。如果所有操作都经过Web服务层,情况会如何改变?再次强调,这样做的成本非常实际 - 在复杂性和性能方面成本较高。 只有客户才能回答这个成本是否值得的问题。


3
如果这是一个Web项目,您需要将IIS服务器的运行用户更改为域用户,并在SQL Server上授予权限给该用户。然后您就可以在连接字符串中使用SSPI,如下所示。这样,您就不需要在web.config中明确地保留用户名或密码。
<configuration>
  <system.web>
    <identity impersonate="true"/> 

  </system.web>

你需要的是连接字符串

"Integrated Security=SSPI;Initial Catalog=TestDb;Data Source=10.10.10.10"


3
有很多客户质疑IT专业人士的工作,就像有很多去看医生的人要求拿药而不是了解他们的病因一样,因为他们已经在网上读到答案了。
我的意思是,他们要求你构建应用程序,作为IT专业人士,当你的应用程序按预期运行时,你应该最懂。 作为专业人士,你应该有勇气告诉客户,如果他认为其他地方能够得到更好的结果,那么他应该到那里去,或者自己构建应用程序; 这是我过去做过的事情,并取得了积极的成果 :)
至于安全性; 或许为了他们的信心,您可以加密web.config并向他们展示,但实际上它什么也不意味着; 如果某人可以访问服务器,他们可以将其解码。 另一方面,想要侵入您的数据库的人必须通过很多屏障。很难闯入,也许是不可能的。另一个选择是简单地阻止来自外部网络的连接,网络或IP范围等。我认为这不应该成为您担心的问题。
还有更多现实的问题需要关注,例如如何防止跨站脚本和其他常见的攻击。

1

客户端的想法是错误的,引入另一层并不能自动提高安全性。

简而言之,对于数据访问,请使用SQL Server角色。例如,内置的data_reader和data_writer角色是一个很好的起点。始终为应用程序使用最合适的最低权限帐户。如果您只需要读取数据,请使用仅具有读取权限的帐户。

尽可能使用Windows身份验证,如果不可能,则至少加密连接字符串。

有关如何执行我所描述的操作的更多信息,请访问http://msdn.microsoft.com/en-us/library/ff650037.aspx#pagpractices0001_dataaccess


1

0
您可以在数据库中启用加密连接,并告知客户连接已加密,从而实现完全安全的目的。

谢谢您的建议。我打算提供以下建议:1)使用Windows身份验证而不是SQL Server身份验证,2)将SQL Server端口更改为除1433以外的其他端口。这应该足够了吧? - Ash8087
就像Chris所说的那样,数据库服务器可能没有暴露,因此如果有人可以访问它,这意味着前端Web服务器已经受到了攻击。虽然更改端口仍然是一个好主意。 - Machinegon

-1
为了增强安全性并满足客户需求,您可以在计算机之间使用隧道
您需要在数据库所在的服务器上设置一个隧道程序,并在客户端计算机上设置客户端隧道程序。通过隧道连接两台计算机,从而实现数据库连接。
所有数据交换都是高度安全的(如果隧道支持,则还可以进行压缩)。

http://en.wikipedia.org/wiki/Tunneling_protocol

http://en.wikipedia.org/wiki/HTTP_tunnel

顺便说一句,我连接服务器只通过隧道进行任何操作。


-2

我从来不喜欢使用web config。注册表更安全。

最佳实践是:

  • 在注册表中隐藏连接字符串的重要项
  • 加密连接中的重要项,如用户名、密码和服务器名称,在注册表中
  • 通过类访问注册表
  • 动态生成连接字符串,并且仅在每个页面需要时生成
  • 对每个页面进行错误处理,以防出现错误时显示连接字符串
  • 完成后始终关闭连接。避免内存泄漏
  • 始终关闭和重置DataReaders

为了增强安全性

  • 您可以构建一个单独的程序来创建连接字符串,并将该项目作为库引用到解决方案中
  • 如果您想要真正安全,您的客户是正确的。将信息发送到与数据库通信的dll中。这是很多工作

来源:

来自ScottGu @ http://msdn.microsoft.com/en-us/library/Aa302406

可扩展性:

关于可扩展性:通过自定义管理软件,可以非常容易地在Web Farm上创建/编辑注册表键。

http://weblogs.asp.net/scottgu/archive/2010/09/08/introducing-the-microsoft-web-farm-framework.aspx

最后,对于所有投票反对我的人,我想说的是:开箱即用的安全性是不够的。安全是一门艺术而非科学。
黑客知道密码默认存储的位置......
ASP.NET 4.0 粉丝们:
微软使 asp.net 4.0 网站部署注册表设置变得容易:

http://msdn.microsoft.com/en-us/library/dd394698.aspx


很好奇为什么有人会对这篇文章点踩,我认为这篇回答已经足够有建设性了。但是如果他提供了一些实际的例子,页面可能会变得非常长。在我看来,这篇文章值得点赞。 - Simon Dugré
@SimoN:这是不好的,因为它基本上是在倡导通过模糊来实现安全。我想不出任何将与Web相关的内容放入注册表中的理由,而且它肯定不会扩展。 - chris
关于可扩展性:通过自定义管理软件,可以非常容易地在 Web Farm 上创建/编辑注册表键。http://weblogs.asp.net/scottgu/archive/2010/09/08/introducing-the-microsoft-web-farm-framework.aspx - Internet Engineer
@InternetEngineer:那篇注册表文章是来自 .Net 1.1。 - chris
微软使得asp.net 4.0网站部署注册表设置变得容易:http://msdn.microsoft.com/en-us/library/dd394698.aspx - Internet Engineer
祝你部署到云端好运。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接