保护连接字符串
摘自MSDN
保护对数据源的访问是安全应用程序最重要的目标之一。为了帮助限制对数据源的访问,必须保护连接信息(例如用户标识、密码和数据源名称)的连接信息。以纯文本形式存储用户标识和密码(例如在源代码中)会造成严重的安全问题。即使为外部源提供包含用户标识和密码信息的编译版代码,编译的代码也可能会被反汇编,用户标识和密码可能会被使用 MSIL 反汇编程序 (Ildasm.exe) 工具公开。因此,关键信息(如用户标识和密码)一定不要存在于代码中。
指定 Windows 身份验证(集成安全性)
建议您尽可能使用 Windows 身份验证(也称为集成安全性)。连接字符串中使用的语法依提供程序而异。下表显示 .NET Framework 数据提供程序所使用的语法。
提供程序 | 语法 |
---|---|
SqlClient |
Integrated Security=true; |
SqlClient, OleDb |
Integrated Security=SSPI; |
Odbc |
Trusted_Connection=yes; |
OracleClient |
Integrated Security=yes; |
注意,在对 OleDb 提供程序使用 Integrated Security=true 时会引发异常。
安全注意 |
---|
如果在连接字符串中将 Persist Security Info 关键字设置为 true 或 yes,将允许在打开连接后,从连接中获得涉及安全性的信息(包括用户标识和密码)。如果在建立连接时必须提供用户标识和密码,最安全的方法是在使用信息打开连接后丢弃这些信息,在 Persist Security Info 设置为 false 或 no 时会发生这种情况。当您向不可信的源提供打开的连接,或将连接信息永久保存到磁盘时,这点尤其重要。如果将 Persist Security Info 保持为 false,可帮助确保不可信的源无法访问连接中涉及安全性的信息,并帮助确保任何涉及安全性的信息都不会随连接字符串信息永久保存到磁盘中。默认情况下,Persist Security Info 设置为 false。 |
不要使用通用数据链接文件
可以在通用数据链接 (UDL) 文件中提供 OleDbConnection 的连接信息;但是,应避免这样做。UDL 文件未加密,会以明文的形式公开连接字符串信息。因为 UDL 文件对应用程序来说是基于外部文件的资源,所以,无法使用 .NET Framework 保护其安全。
将连接字符串存储在配置文件中
为了避免将连接字符串存储在代码中,可以将代码存储在 ASP.NET 应用程序的 web.config 文件中以及 Windows 应用程序的 app.config 文件中。
连接字符串可以存储在配置文件的 <connectionStrings> 元素中。连接字符串存储为键/值对的形式,可以在运行时使用名称查找存储在 connectionString 属性中的值。以下配置文件示例显示名为 DatabaseConnection 的连接字符串,该连接字符串引用连接到 SQL Server 本地实例的连接字符串。
<connectionStrings> <add name="DatabaseConnection" connectionString="Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local);" providerName="System.Data.SqlClient" /> </connectionStrings>
从配置文件中检索连接字符串
System.Configuration 命名空间提供使用配置文件中存储的配置信息的类。ConnectionStringSettings 类具有两个属性,映射到上面所示的 <connectionStrings> 示例部分中显示的名称。
- ConnectionString
-
连接字符串。
- Name
-
<connectionStrings> 部分的连接字符串的名称。
以下示例通过将连接字符串的名称传递给 ConfigurationManager,再由其返回 ConnectionStringSettings 对象,以便从配置文件中检索字符串。ConnectionString 属性用于显示此值。
Visual Basic
Option Explicit On Option Strict On Imports System.Configuration Module Module1 Sub Main() Dim settings As ConnectionStringSettings settings = _ ConfigurationManager.ConnectionStrings("DatabaseConnection") If Not settings Is Nothing Then Console.WriteLine(settings.ConnectionString) End If End Sub End Module
C#
using System; using System.Configuration; class Program { static void Main() { ConnectionStringSettings settings; settings = ConfigurationManager.ConnectionStrings["DatabaseConnection"]; if (settings != null) { Console.WriteLine(settings.ConnectionString); } } }
使用受保护的配置加密连接字符串
“受保护的配置”功能可以用于加密配置文件(例如 ASP.NET 应用程序的 Web.config 文件或 Windows 应用程序的 App.config 文件)中的敏感信息,包括用户名和密码、数据库连接字符串和加密密钥。请参见使用受保护的配置加密配置信息、对配置节进行加密和解密和演练:使用受保护的配置加密配置信息。
通过用户输入构造连接字符串
如果从外部源(例如提供用户标识和密码的用户)获取连接字符串信息,必须验证来自该源的所有输入,确保其格式正确并且不包含影响连接的其他参数。有关详细信息,请参见验证用户输入。
使用连接字符串生成器
DbConnectionStringBuilder 类提供用于派生强类型化的连接字符串生成器的基类。这些生成器使您可以通过编程创建语法上正确的连接字符串以及分析和重建现有的连接字符串。可以使用 DbConnectionStringBuilder 类分配任意键/值对,并将生成的连接字符串传递给强类型化的提供程序。以下作为 .NET Framework 的一部分提供的数据提供程序提供从 DbConnectionStringBuilder 继承的强类型化的类:
- SqlConnectionStringBuilder
- OracleConnectionStringBuilder
- OdbcConnectionStringBuilder
- OleDbConnectionStringBuilder
请参见
任务
概念
使用连接字符串
加密和数据访问
Securing the User's Password
其他资源
保证 ADO.NET 应用程序的安全
使用受保护的配置加密配置信息