Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Область применения: .NET Framework
.NET .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);
}
}