Построители строк подключения
Область применения: платформа .NET Framework .NET Standard
В ранних версиях 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);
}
}