Построители строк соединения (ADO.NET)

Обновлен: November 2007

В более ранних версиях ADO.NET проверка строк подключения, объединенных со значениями строки, во время компиляции не проводилась, поэтому во время выполнения неверное ключевое слово приводило к исключению ArgumentException. Каждый из поставщиков данных платформы .NET Framework поддерживал различный синтаксис ключевых слов строк соединения, что делало ручное построение допустимых строк соединения затруднительным. Для решения этой проблемы в ADO.NET 2.0 появились новые построители строк подключения для каждого поставщика данных платформы .NET Framework. Каждый поставщик данных включает класс построителя строк соединения со строгой типизацией, наследованный от класса DbConnectionStringBuilder. В следующей таблице перечислены поставщики данных платформы .NET Framework и связанные с ними классы построителей строк соединения.

Поставщик

Класс ConnectionStringBuilder

System.Data.SqlClient

SqlConnectionStringBuilder

System.Data.OleDb

OleDbConnectionStringBuilder

System.Data.Odbc

OdbcConnectionStringBuilder

System.Data.OracleClient

OracleConnectionStringBuilder

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

Атака путем внедрения данных в строку соединения может произойти при использовании динамического объединения строк для построения строк соединения, основанных на входных данных пользователя. Если строка не проверяется, а вредоносный текст или символы не экранируются, злоумышленник может получить потенциальный доступ к конфиденциальным данным или другим ресурсам сервера. Например, злоумышленник может осуществить атаку, установив точку с запятой и добавив дополнительное значение. Строка соединения анализируется с помощью алгоритма «по последнему значению», и допустимое значение заменяется вредоносными данными.

Классы построителей строк соединения созданы для устранения предположений и защиты от синтаксических ошибок и уязвимостей системы безопасности. Они предоставляют методы и свойства, соответствующие известным парам «ключ-значение», разрешенным каждым поставщиком данных. Каждый класс поддерживает фиксированную коллекцию синонимов и может переводить синоним в соответствующее общеизвестное ключевое имя. Выполняются проверки на допустимые пары «ключ-значение», и недопустимая пара вызывает исключение. Кроме того, внедренные значения обрабатываются безопасным образом.

В следующем примере демонстрируется обработка с помощью объекта SqlConnectionStringBuilder дополнительного значения для параметра Initial Catalog.

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 правильно выполняет обработку параметра путем экранирования дополнительного значения, заключенного в двойные кавычки, вместо того чтобы добавить его в строку соединения в качестве новой пары «ключ-значение».

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

Построение строк соединения из файлов конфигурации

Если некоторые элементы строки соединения известны заранее, их можно сохранить в файле конфигурации и во время выполнения получить для построения полной строки соединения. Например, в отличие от имени сервера, имя базы данных может быть известно заранее. Также можно принудительно задать ввод пользователем имени и пароля во время выполнения, чтобы исключить возможность внедрения других значений в строку соединения.

Один из перегруженных конструкторов для построителя строки соединения принимает в качестве аргумента значение типа String, что позволяет использовать частичную строку соединения, которую впоследствии пользователь может дополнить. Частичную строку соединения можно сохранить в файле конфигурации и получить во время выполнения.

ms254947.alert_note(ru-ru,VS.90).gifПримечание.

Пространство имен System.Configuration обеспечивает программный доступ к файлам конфигурации, предоставляя класс WebConfigurationManager для веб-приложений и класс ConfigurationManager для приложений Windows. Дополнительные сведения о работе со строками подключения и файлами конфигурации см. в разделе Строки соединения и файлы конфигурации (ADO.NET).

Пример

В этом примере демонстрируется получение частичной строки соединения из файла конфигурации и ее завершение путем установки свойств DataSource, UserID и Password для объекта SqlConnectionStringBuilder. Файл конфигурации определяется следующим образом.

<connectionStrings>
  <clear/>
  <add name="partialConnectString" 
    connectionString="Initial Catalog=Northwind;"
    providerName="System.Data.SqlClient" />
</connectionStrings>
ms254947.alert_note(ru-ru,VS.90).gifПримечание.

Для запуска кода необходимо задать в проекте ссылку на библиотеку System.Configuration.dll.

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

См. также

Основные понятия

Конфиденциальность и безопасность данных (ADO.NET)

Другие ресурсы

Строки соединения (ADO.NET)