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


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

Область применения: платформа .NET Framework .NET Standard

Скачать ADO.NET

В ранних версиях ADO.NET проверка строк подключения со сцепленными строковыми значениями не выполнялась во время компиляции, поэтому из-за неправильного ключевого слова во время выполнения создавалось исключение ArgumentException. Поставщик данных Microsoft SqlClient для SQL Server содержит класс построителя строк подключения Microsoft.Data.SqlClient.SqlConnectionStringBuilder, наследуемый от DbConnectionStringBuilder.

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

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

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

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

Пример

В этом примере демонстрируется получение частичной строки соединения из файла конфигурации и ее завершение путем установки свойств 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);
    }
}

См. также