8

我们有一个 ASP.NET 4.0 Web 应用程序,它通过 LAN 连接到另一台机器上的 SQL Server。我使用存储在我的 Web.config 中的 ConnectionString(带有 SQL Server 身份验证)来执行此操作。基本上,这是一种相当传统的 Web-Server-to-SQL 策略。

然而,我们的一位客户认为这种策略并不安全。这个客户端说我们应该只通过一个单独的 Web 服务层连接到 SQL Server。

我真的不想为了满足这个客户而重写这个应用程序。我应该告诉他什么?有谁知道我如何最好地反驳这一点?

提前致谢...

4

8 回答 8

11

安全始终是一种权衡。客户真正害怕的是什么?

拥有“明确”的数据库凭据?我已经看到审计人员指出这是一个潜在的漏洞,但实际上,如果有人入侵了您的 Web 服务器,他们可以针对数据库运行任意代码,因此加密数据库凭据并不会真正为您带来太多好处。

您的 Web 应用程序应该使用最低权限的用户连接到数据库,因此破坏 Web 服务器应该只授予您读取和更新数据的权限。如果一切都通过 Web 服务层,那将如何改变?同样,通过访问 Web 服务层会产生非常实际的成本 - 复杂性和性能。只有客户才能回答这笔费用是否值得。

于 2012-04-26T18:39:00.020 回答
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"

于 2012-04-26T18:37:44.213 回答
3

有很多客户在争论 IT 专业人员的工作,就像很多人去看医生时问的是药而不是他们得了什么病,因为他们在网上看到这个问题后就已经知道答案了。

我的意思是,他们要求您构建应用程序,而您作为 IT 专业人员应该最清楚您的应用程序何时按预期工作。作为专业人士,您应该有胆量告诉您的客户,如果他认为可以在其他地方做得更好,他应该去那里或者自己构建应用程序;这就是过去所做的并取得了积极成果:)

关于安全;也许出于他们的信心,您可以加密web.config并显示它们,但实际上这没有任何意义;如果有人可以访问服务器,他们就可以对其进行解码。另一方面,想要闯入您的数据库的人应该通过许多障碍。很难闯入,也许是不可能的。另一种选择是简单地阻止来自网络或 IP 范围或其他任何外部网络的连接。我认为这不应该是一件值得担心的事情。

还有更多和更现实的问题需要担心,例如防止跨站点脚本和此类常见处理。

于 2012-04-26T18:56:02.163 回答
1

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

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

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

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

于 2012-04-26T19:04:42.373 回答
1

一种可能性是加密 web.config 中的部分。因此,只有可以直接访问网络服务器的用户才能解密此部分。

这是在 iisreg 工具的帮助下如何工作的:http: //msdn.microsoft.com/en-us/library/zhhddkxy.aspx

于 2012-04-26T19:29:14.217 回答
0

您可以在您的数据库中启用加密连接并告诉客户端连接已加密如此完全安全?

于 2012-04-26T18:30:57.430 回答
-1

为了使其更安全并满足您的客户,您可以在计算机之间使用隧道。

您在数据库所在的位置设置服务器隧道程序,并在客户端计算机上设置客户端隧道程序。您通过隧道将一台计算机连接到另一台计算机,并且数据库连接通过隧道进行。

并且一切都是高度安全的交换(如果隧道支持它,则压缩)。

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

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

Ps 对于我所做的任何事情,我只通过隧道连接到我的服务器。

于 2012-04-26T19:12:44.040 回答
-2

我从不喜欢使用网络配置。注册表更安全。

最佳实践是:

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

为了额外的安全

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

资料来源:

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

可扩展性:

关于可扩展性:使用自定义管理软件可以非常轻松地在 Web 场中创建\编辑注册表项。

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

最后,给所有投票给我的人。开箱即用的安全性是不够的。安全是一门艺术而不是科学。

黑客默认知道密码存储在哪里......

ASP.NET 4.0 爱好者

Microsoft 使 asp.net 4.0 网站可以轻松部署注册表设置:

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

于 2012-04-26T19:23:23.127 回答