连接字符串生成器

适用于:.NET Framework .NET .NET Standard

下载 ADO.NET

在 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)。 有关使用连接字符串和配置文件的详细信息,请参阅连接字符串和配置文件

示例

此示例演示如何从配置文件中检索部分连接字符串并通过设置 DataSourceUserIDPasswordSqlConnectionStringBuilder 属性完成该连接字符串。 配置文件定义如下。

<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);
    }
}

另请参阅