Построители строк подключенияConnection String Builders

В более ранних версиях ADO.NET проверка строк подключения со сцепленными строковыми значениями не выполнялась, так что во время выполнения неверное ключевое слово создавало ArgumentException.In earlier versions of ADO.NET, compile-time checking of connection strings with concatenated string values did not occur, so that at run time, an incorrect keyword generated an ArgumentException. Каждый из .NET Framework поставщиков данных поддерживал разный синтаксис для ключевых слов строки подключения, что делает несложным создание допустимых строк соединения, если это сделано вручную.Each of the .NET Framework data providers supported different syntax for connection string keywords, which made constructing valid connection strings difficult if done manually. Для решения этой проблемы в ADO.NET 2,0 появились новые построители строк подключения для каждого .NET Framework поставщика данных.To address this problem, ADO.NET 2.0 introduced new connection string builders for each .NET Framework data provider. Каждый поставщик данных включает класс построителя строк соединения со строгой типизацией, наследованный от класса DbConnectionStringBuilder.Each data provider includes a strongly typed connection string builder class that inherits from DbConnectionStringBuilder. В следующей таблице перечислены поставщики данных .NET Framework и связанные с ними классы построителя строк подключения.The following table lists the .NET Framework data providers and their associated connection string builder classes.

ПоставщикProvider Класс ConnectionStringBuilderConnectionStringBuilder class
System.Data.SqlClient System.Data.SqlClient.SqlConnectionStringBuilder
System.Data.OleDb System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.Odbc System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OracleClient System.Data.OracleClient.OracleConnectionStringBuilder

Атаки путем внедрения данных в строку подключенияConnection String Injection Attacks

Атака путем внедрения данных в строку соединения может произойти при использовании динамического объединения строк для построения строк соединения, основанных на входных данных пользователя.A connection string injection attack can occur when dynamic string concatenation is used to build connection strings that are based on user input. Если строка не проверяется, а вредоносный текст или символы не экранируются, злоумышленник может получить потенциальный доступ к конфиденциальным данным или другим ресурсам сервера.If the string is not validated and malicious text or characters not escaped, an attacker can potentially access sensitive data or other resources on the server. Например, злоумышленник может осуществить атаку, установив точку с запятой и добавив дополнительное значение.For example, an attacker could mount an attack by supplying a semicolon and appending an additional value. Строка соединения анализируется с помощью алгоритма «по последнему значению», и допустимое значение заменяется вредоносными данными.The connection string is parsed by using a "last one wins" algorithm, and the hostile input is substituted for a legitimate value.

Классы построителей строк соединения созданы для устранения предположений и защиты от синтаксических ошибок и уязвимостей системы безопасности.The connection string builder classes are designed to eliminate guesswork and protect against syntax errors and security vulnerabilities. Они предоставляют методы и свойства, соответствующие известным парам «ключ-значение», разрешенным каждым поставщиком данных.They provide methods and properties corresponding to the known key/value pairs permitted by each data provider. Каждый класс поддерживает фиксированную коллекцию синонимов и может переводить синоним в соответствующее общеизвестное ключевое имя.Each class maintains a fixed collection of synonyms and can translate from a synonym to the corresponding well-known key name. Выполняются проверки на допустимые пары «ключ-значение», и недопустимая пара вызывает исключение.Checks are performed for valid key/value pairs and an invalid pair throws an exception. Кроме того, внедренные значения обрабатываются безопасным образом.In addition, injected values are handled in a safe manner.

В следующем примере демонстрируется обработка с помощью объекта SqlConnectionStringBuilder дополнительного значения для параметра Initial Catalog.The following example demonstrates how the SqlConnectionStringBuilder handles an inserted extra value for the Initial Catalog setting.

Dim builder As New System.Data.SqlClient.SqlConnectionStringBuilder  
builder("Data Source") = "(local)"  
builder("Integrated Security") = True  
builder("Initial Catalog") = "AdventureWorks;NewValue=Bad"  
Console.WriteLine(builder.ConnectionString)  
System.Data.SqlClient.SqlConnectionStringBuilder builder =  
  new System.Data.SqlClient.SqlConnectionStringBuilder();  
builder["Data Source"] = "(local)";  
builder["integrated Security"] = true;  
builder["Initial Catalog"] = "AdventureWorks;NewValue=Bad";  
Console.WriteLine(builder.ConnectionString);  

Выход показывает, что объект SqlConnectionStringBuilder правильно выполняет обработку параметра путем экранирования дополнительного значения, заключенного в двойные кавычки, вместо того чтобы добавить его в строку соединения в качестве новой пары «ключ-значение».The output shows that the SqlConnectionStringBuilder handled this correctly by escaping the extra value in double quotation marks instead of appending it to the connection string as a new key/value pair.

data source=(local);Integrated Security=True;  
initial catalog="AdventureWorks;NewValue=Bad"  

Построение строк соединения из файлов конфигурацииBuilding Connection Strings from Configuration Files

Если некоторые элементы строки соединения известны заранее, их можно сохранить в файле конфигурации и во время выполнения получить для построения полной строки соединения.If certain elements of a connection string are known beforehand, they can be stored in a configuration file and retrieved at run time to construct a complete connection string. Например, в отличие от имени сервера, имя базы данных может быть известно заранее.For example, the name of the database might be known in advance, but not the name of the server. Также можно принудительно задать ввод пользователем имени и пароля во время выполнения, чтобы исключить возможность внедрения других значений в строку соединения.Or you might want a user to supply a name and password at run time without being able to inject other values into the connection string.

Один из перегруженных конструкторов для построителя строки соединения принимает в качестве аргумента значение типа String, что позволяет использовать частичную строку соединения, которую впоследствии пользователь может дополнить.One of the overloaded constructors for a connection string builder takes a String as an argument, which enables you to supply a partial connection string that can then be completed from user input. Частичную строку соединения можно сохранить в файле конфигурации и получить во время выполнения.The partial connection string can be stored in a configuration file and retrieved at run time.

Примечание

Пространство имен System.Configuration обеспечивает программный доступ к файлам конфигурации, предоставляя класс WebConfigurationManager для веб-приложений и класс ConfigurationManager для приложений Windows.The System.Configuration namespace allows programmatic access to configuration files that use the WebConfigurationManager for Web applications and the ConfigurationManager for Windows applications. Дополнительные сведения о работе со строками подключения и файлами конфигурации см. в разделе строки подключения и файлы конфигурации.For more information about working with connection strings and configuration files, see Connection Strings and Configuration Files.

ПримерExample

В этом примере демонстрируется получение частичной строки соединения из файла конфигурации и ее завершение путем установки свойств DataSource, UserID и Password для объекта SqlConnectionStringBuilder.This example demonstrates retrieving a partial connection string from a configuration file and completing it by setting the DataSource, UserID, and Password properties of the SqlConnectionStringBuilder. Файл конфигурации определяется следующим образом.The configuration file is defined as follows.

<connectionStrings>  
  <clear/>  
  <add name="partialConnectString"   
    connectionString="Initial Catalog=Northwind;"  
    providerName="System.Data.SqlClient" />  
</connectionStrings>  

Примечание

Для запуска кода необходимо задать в проекте ссылку на библиотеку System.Configuration.dll.You must set a reference to the System.Configuration.dll in your project for the code to run.

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);
    }
}
Private Sub BuildConnectionString(ByVal dataSource As String, _
    ByVal userName As String, ByVal userPassword As String)

    ' Retrieve the partial connection string named databaseConnection
    ' from the application's app.config or web.config file.
    Dim settings As ConnectionStringSettings = _
       ConfigurationManager.ConnectionStrings("partialConnectString")

    If Not settings Is Nothing Then
        ' Retrieve the partial connection string.
        Dim connectString As String = settings.ConnectionString
        Console.WriteLine("Original: {0}", connectString)

        ' Create a new SqlConnectionStringBuilder based on the
        ' partial connection string retrieved from the config file.
        Dim builder As New SqlConnectionStringBuilder(connectString)

        ' Supply the additional values.
        builder.DataSource = dataSource
        builder.UserID = userName
        builder.Password = userPassword

        Console.WriteLine("Modified: {0}", builder.ConnectionString)
    End If
End Sub

См. такжеSee also