Поделиться через


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

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

Поставщик

Класс ConnectionStringBuilder

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

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

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

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

В следующем примере демонстрируется обработка с помощью объекта 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, что позволяет использовать частичную строку соединения, которую впоследствии пользователь может дополнить.Частичную строку соединения можно сохранить в файле конфигурации и получить во время выполнения.

ПримечаниеПримечание

Пространство имен 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>
ПримечаниеПримечание

Для запуска кода необходимо задать в проекте ссылку на библиотеку 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)