Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy: .NET Framework
.NET
Standard
We wcześniejszych wersjach ADO.NET sprawdzanie w czasie kompilacji parametrów połączenia z połączonymi wartościami łańcuchowymi nie miało miejsca, co skutkowało tym, że w czasie wykonywania niepoprawne słowo kluczowe generowało ArgumentException. Dostawca danych Microsoft SqlClient dla programu SQL Server zawiera klasę Microsoft.Data.SqlClient.SqlConnectionStringBuilder konstruktora parametrów połączenia, która dziedziczy z DbConnectionStringBuilderklasy .
Ataki iniekcji parametrów połączenia
Atak polegający na wstrzyknięciu do ciągu połączenia może wystąpić, gdy do tworzenia ciągów połączenia opartych na danych wejściowych użytkownika stosuje się dynamiczne łączenie ciągów. Jeśli ciąg nie został zweryfikowany, a złośliwy tekst lub znaki nie zostały usunięte, osoba atakująca może uzyskać dostęp do poufnych danych lub innych zasobów na serwerze. Na przykład osoba atakująca może przeprowadzić atak, poprzez podanie średnika i dołączenie innej wartości. Parametry połączenia są analizowane przy użyciu algorytmu "last one wins", a złośliwe dane wejściowe są zastępowane wiarygodną wartością.
Klasy kreatora parametrów połączenia zostały zaprojektowane tak, aby wyeliminować konieczność zgadywania i chronić przed błędami składni oraz lukami w zabezpieczeniach. Udostępniają metody i właściwości odpowiadające znanym parom klucz/wartość dozwolonym przez dostawcę danych. Każda klasa zawiera stały zbiór synonimów i może tłumaczyć synonim na odpowiadającą mu standardową nazwę klucza. Sprawdzanie jest wykonywane dla prawidłowych par klucz/wartość, a nieprawidłowa para zgłasza wyjątek. Ponadto wprowadzone wartości są obsługiwane w bezpieczny sposób.
W poniższym przykładzie pokazano, jak SqlConnectionStringBuilder obsługuje wstawioną dodatkową wartość ustawienia Initial Catalog .
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = "(local)";
builder.IntegratedSecurity = true;
builder.InitialCatalog = "AdventureWorks;NewValue=Bad";
Console.WriteLine(builder.ConnectionString);
Dane wyjściowe pokazują, że SqlConnectionStringBuilder obsłużyła ją poprawnie, uciekając przed dodatkową wartością w podwójnych cudzysłowach, zamiast dołączać ją do parametrów połączenia jako nową parę klucz/wartość.
data source=(local);Integrated Security=True;
initial catalog="AdventureWorks;NewValue=Bad"
Tworzenie parametrów połączenia na podstawie plików konfiguracji
Jeśli niektóre elementy parametrów połączenia są znane wcześniej, mogą być przechowywane w pliku konfiguracji i pobierane w czasie wykonywania w celu utworzenia pełnych parametrów połączenia. Na przykład nazwa bazy danych może być znana z wyprzedzeniem, ale nie nazwa serwera. Możesz chcieć, aby użytkownik podał nazwę i hasło w czasie wykonywania programu, bez możliwości wstrzykiwania innych wartości do ciągu połączenia.
Jeden z przeciążonych konstruktorów klasy tworzącej ciąg połączenia przyjmuje jako argument String, co umożliwia podanie częściowego ciągu połączenia, który można następnie uzupełnić na podstawie danych wprowadzonych przez użytkownika. Parametry połączenia częściowego mogą być przechowywane w pliku konfiguracji i pobierane w czasie wykonywania.
Uwaga / Notatka
Przestrzeń nazw System.Configuration umożliwia programowy dostęp do plików konfiguracji, które używają WebConfigurationManager w aplikacjach internetowych oraz ConfigurationManager w aplikacjach systemu Windows. Aby uzyskać więcej informacji na temat pracy z plikami parametry połączenia i plikami konfiguracji, zobacz Parametry połączenia i pliki konfiguracji.
Example
W tym przykładzie pokazano, jak pobrać częściowy ciąg połączenia z pliku konfiguracyjnego i uzupełnić go poprzez ustawienie właściwości DataSource, UserID oraz PasswordSqlConnectionStringBuilder. Plik konfiguracji jest zdefiniowany w następujący sposób.
<connectionStrings>
<clear/>
<add name="partialConnectString"
connectionString="Initial Catalog=Northwind;"
providerName="Microsoft.Data.SqlClient" />
</connectionStrings>
Uwaga / Notatka
Musisz ustawić odwołanie do System.Configuration.dll elementu w projekcie, aby kod został uruchomiony.
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);
}
}