将 ASP.NET 连接到 SQL Server 的最佳做法
本文关键字:最佳 Server SQL ASP NET 连接 | 更新日期: 2023-09-27 18:32:18
我们有一个 ASP.NET 4.0 Web 应用程序,它通过 LAN 连接到单独计算机上的 SQL Server。 我使用存储在我的 Web.config 中的 ConnectionString(带有 SQL Server 身份验证)来执行此操作。 基本上,这是一个相当传统的Web服务器到SQL策略。
但是,我们的一位客户认为这种策略并不安全。 这个客户端说我们只应该通过单独的 Web 服务层连接到 SQL Server。
我真的不想重写这个应用程序只是为了满足这个客户。 我应该告诉他什么? 有谁知道我如何最好地反驳这一点?
提前感谢...
安全性始终是一种权衡。客户真正害怕的是什么?
拥有"明文"的数据库凭据?我已经看到审计人员指出这是一个潜在的漏洞,但实际上,如果有人破坏了您的Web服务器,他们可以对数据库运行任意代码,因此加密数据库凭据并不能真正为您买多少钱。
您的 Web 应用程序应该使用最低权限用户连接到数据库,因此破坏 Web 服务器应该只授予您读取和更新数据的权限。 如果一切都通过 Web 服务层,情况会如何变化? 同样,使用Web服务层在复杂性和性能方面都有非常实际的成本。 只有客户才能回答这笔费用是否值得。
如果这是一个 Web 项目,则需要将运行 user 的 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"
有许多客户争论IT专业人员的工作,就像有很多人去看医生询问药物而不是他们患有什么疾病一样,因为他们已经知道答案,因为他们在互联网上读到它。
我的意思是,他们要求您构建应用程序,而您作为 IT 专业人员应该最了解应用程序何时按预期工作。作为一名专业人士,你应该有球告诉你的客户,如果他认为可以更好地到达其他地方,他应该去那里,或者自己构建应用程序;这就是过去所做的积极成果:)
关于安全性;也许为了他们的信心,你可以加密web.config
并向他们展示,但实际上它没有任何意义;如果有人可以访问服务器,他们可以解码它。另一方面,想要闯入您的数据库的人应该通过很多障碍。很难闯入,也许是不可能的。另一种选择是简单地阻止来自外部网络、网络或 ip 范围或其他任何设备的连接。我认为这不应该是值得担心的事情。
还有更多甚至更现实的问题需要担心,例如防止跨站点脚本和此类常见问题。
客户端错误地引入另一个层不会自动提高安全性。
简而言之,使用 SQL 服务器角色进行数据访问,例如内置data_reader和data_writer角色是一个很好的起点。始终为应用程序使用最合适的最低特权帐户。如果只需要读取数据,请使用只能读取的帐户。
尽可能使用 Windows 身份验证,如果不可能,则至少加密连接字符串。
有关如何执行我所描述的操作的更多信息,请访问 http://msdn.microsoft.com/en-us/library/ff650037.aspx#pagpractices0001_dataaccess
一种可能性是加密 web.config 中的部分。因此,只有可以直接访问Web服务器的用户才能解密此部分。
以下是在iisreg-tool的帮助下如何工作:http://msdn.microsoft.com/en-us/library/zhhddkxy.aspx
您可以在数据库中启用加密连接,并告诉客户端连接已加密,因此完全安全?
为了使其更安全,并满足您的客户需求,您可以在计算机之间使用隧道。
在数据库存在的地方设置服务器隧道程序,并在客户端计算机上设置客户端隧道程序。通过隧道将一台计算机连接到另一台计算机,数据库连接通过隧道进行。
一切都是交换高度安全的(如果隧道支持,则进行压缩)。
http://en.wikipedia.org/wiki/Tunneling_protocol
http://en.wikipedia.org/wiki/HTTP_tunnel
Ps 我只通过隧道连接到我的服务器,以便我所做的任何事情。
我从不喜欢使用网络配置。注册表更安全。
最佳做法是:
- 在注册表中隐藏连接字符串的重要项
- 加密连接中的重要项目,如用户名,密码和服务器名称注册表
- 通过类访问注册表
- 动态构建连接字符串,并且仅在每页需要时才生成 错误
- 处理每个页面,以便在发生错误时不会显示连接字符串
- 完成后,请务必关闭连接。避免内存泄漏
- 始终关闭和重置数据读取器
为了额外的安全性
- 可以生成单独的程序来创建连接字符串和将该项目作为解决方案中的库引用
- 如果你想真正安全,你的客户是正确的。将信息发送到将与数据库通信的 dll。这是很多工作
来源:
来自 斯科特古 @ 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