数据库连接字符串是针对数据访问代码主要考虑的配置管理问题。应认真考虑这些字符串的存储位置以及如何保护它们(特别是当它们包括凭据时)。要提高加密管理安全性:
•使用 Windows 身份验证。
•确保连接字符串的安全。
•使用受限制的 ACL 确保 UDL 文件的安全。
使用 Window 身份验证
使用 Windows 身份验证时,系统会为您管理凭据,而且凭据不会通过网络传输。还可以避免将用户名和密码嵌入到连接字符串中。
确保连接字符串的安全
如果您需要使用 SQL 身份验证,连接字符串中将包含用户名和密码。如果攻击者利用 Web 服务器上的源代码泄漏这一漏洞或设法登录到该服务器,则攻击者可以检索连接字符串。同样,能够合法登录到该服务器的任何用户都可以查看它们。使用加密机制确保连接字符串的安全。
加密连接字符串
使用 DPAPI 加密连接字符串。使用 DPAPI 加密时,由于加密密钥由平台进行管理,并且绑定到特定的计算机或 Windows 用户帐户,因此可避免出现加密密钥管理问题。要使用 DPAPI,必须通过 P/Invoke 调用 Win32 DPAPI 函数。
有关如何构建托管包装类的详细信息,请参阅“Microsoft patterns & practices Volume I, Building Secure ASP.NET Web Applications: Authentication, Authorization, and Secure Communication”的“How To”部分中的“How To: Create a DPAPI Library”,其网址为:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetlpMSDN.asp(英文)。
安全地存储加密的连接字符串
加密的连接字符串可以放在注册表中,也可以放在 Web.config 或 Machine.config 文件中。如果您使用 HKEY_LOCAL_MACHINE 下的注册表项,请将下面的 ACL 应用于该项:
管理员:完全控制 进程帐户:读取
注意 该进程帐户由运行数据访问程序集的进程来确定。这通常是 ASP.NET 进程,或者当您的解决方案使用企业服务中间层时,该进程是企业服务服务器进程。
还可以考虑使用 HKEY_CURRENT_USER,该注册表项提供受限制的访问。有关详细信息,请参阅模块 7 构建安全的程序集中的“注册表”部分。
注意 如果您使用 Microsoft Visual Studio® .NET 数据库连接向导,连接字符串将以明文属性值形式存储在 Web 应用程序代码隐藏文件或 Web.config 文件中。这两种方法都应该避免使用。
为了更容易部署,您可能希望将加密的字符串存储在 Web.config 中,尽管这可能不如使用受限制的注册表项安全。在本例中,将使用如下所示的自定义
...
要从
using System.Configuration; private static string GetConnectionString() { return ConfigurationSettings.AppSettings["connectionString"]; }
不要将 Persist Security Info 设置为“True”或“Yes”
如果在连接字符串中包括 Persist Security Info 属性,将导致 ConnectionString 属性在密码返回给用户之前,将密码从连接字符串中去除。在建立与数据库的连接之后,默认设置 false(等同于忽略 Persist Security Info 属性)会丢弃该信息。
使用受限制的 ACL 确保 UDL 文件的安全
如果您的应用程序结合使用外部通用数据链接 (UDL) 文件和面向 OLE DB 的 ADO.NET 托管数据提供程序,请使用 NTFS 权限来限制访问。使用以下受限制的 ACL:
管理员:完全控制 进程帐户:读取
注意 UDL 文件未进行加密。一个更安全的方法是,使用 DPAPI 加密连接字符串,并将其存储在受限制的注册表项中。