连接字符串生成器
适用于: .NET Framework .NET .NET Standard
在 ADO.NET 的早期版本中,不会对具有串联字符串值的连接字符串进行编译时检查,因此在运行时会生成不正确的关键字 ArgumentException。 用于 SQL Server 的 Microsoft SqlClient 数据提供程序包括从 DbConnectionStringBuilder 继承的连接字符串生成器类 Microsoft.Data.SqlClient.SqlConnectionStringBuilder。
连接字符串注入攻击
当使用动态字符串串联根据用户输入生成连接字符串时,可能发生连接字符串注入式攻击。 如果字符串未经过验证,并且恶意文本或字符未转义,那么攻击者可能会访问服务器上的敏感数据或其他资源。 例如,攻击者可能会提供分号并追加另一个值来装载攻击。 通过使用“last one wins”算法分析连接字符串,恶意输入将替换为合法值。
连接字符串生成器类旨在排除推测,防止出现语法错误和安全漏洞。 它们提供与数据提供程序所允许的已知键/值对相对应的方法和属性。 每个类都保持一个固定的同义词集合,可以将同义词转换为相应的已知键名。 对有效的键/值对进行检查,无效对会引发异常。 另外,以安全的方式处理注入的值。
下面的示例演示 SqlConnectionStringBuilder 如何处理为 Initial Catalog
设置插入的额外值。
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = "(local)";
builder.IntegratedSecurity = true;
builder.InitialCatalog = "AdventureWorks;NewValue=Bad";
Console.WriteLine(builder.ConnectionString);
输出结果表明,SqlConnectionStringBuilder 对其进行了正确的处理,方法是用双引号转义多余的值,而不是将它作为新的键/值对追加到连接字符串中。
data source=(local);Integrated Security=True;
initial catalog="AdventureWorks;NewValue=Bad"
从配置文件生成连接字符串
如果事先知道连接字符串的某些元素,则可以将其存储在配置文件中,并在运行时检索它们以构造完整连接字符串。 例如,可能事先知道数据库的名称,但不知道服务器的名称。 或者,你可能希望用户在运行时提供名称和密码,但不能将其他值注入到连接字符串中。
连接字符串生成器的一个重载构造函数将 String 作为自变量,这可让你提供部分连接字符串,然后通过用户输入使这部分连接字符串成为完整字符串。 该部分连接字符串可以存储在配置文件中并在运行时进行检索。
备注
System.Configuration 命名空间允许通过编程方式访问配置文件(对 Web 应用程序使用 WebConfigurationManager,对 Windows 应用程序使用 ConfigurationManager)。 有关使用连接字符串和配置文件的详细信息,请参阅连接字符串和配置文件。
示例
此示例演示如何从配置文件中检索部分连接字符串并通过设置 DataSource 的 UserID、Password 和 SqlConnectionStringBuilder 属性完成该连接字符串。 配置文件定义如下。
<connectionStrings>
<clear/>
<add name="partialConnectString"
connectionString="Initial Catalog=Northwind;"
providerName="Microsoft.Data.SqlClient" />
</connectionStrings>
备注
必须在项目中设置对 System.Configuration.dll
的引用,才能运行代码。
private static void BuildConnectionString(string dataSource,
string userName, string userPassword)
{
// Retrieve the partial connection string named databaseConnection
// from the application's app.config or web.config file.
ConnectionStringSettings settings =
ConfigurationManager.ConnectionStrings["partialConnectString"];
if (null != settings)
{
// Retrieve the partial connection string.
string connectString = settings.ConnectionString;
Console.WriteLine("Original: {0}", connectString);
// Create a new SqlConnectionStringBuilder based on the
// partial connection string retrieved from the config file.
SqlConnectionStringBuilder builder =
new SqlConnectionStringBuilder(connectString);
// Supply the additional values.
builder.DataSource = dataSource;
builder.UserID = userName;
builder.Password = userPassword;
Console.WriteLine("Modified: {0}", builder.ConnectionString);
}
}