Verbindungszeichenfolgen-GeneratorenConnection String Builders

In früheren Versionen von ADO.NET zur Kompilierzeit für Verbindungszeichenfolgen mit erfolgte für verkettete Zeichenfolgenwerte nicht stattgefunden hat, sodass zur Laufzeit ein falsches Schlüsselwort generiert eine ArgumentException.In earlier versions of ADO.NET, compile-time checking of connection strings with concatenated string values did not occur, so that at run time, an incorrect keyword generated an ArgumentException. Jeder von .NET Framework-Datenanbietern unterstützt andere Syntax für Schlüsselwörter in Verbindungszeichenfolgen, was die erstellen gültige Verbindungszeichenfolgen schwierig, wenn Sie manuell durchgeführt.Each of the .NET Framework data providers supported different syntax for connection string keywords, which made constructing valid connection strings difficult if done manually. Um dieses Problem zu beheben, wurde in ADO.NET 2.0 neue Verbindungszeichenfolgen-Generatoren für jeden .NET Framework-Datenanbieter eingeführt.To address this problem, ADO.NET 2.0 introduced new connection string builders for each .NET Framework data provider. Alle Datenanbieter stellen eine stark typisierte Verbindungszeichenfolgen-Generatorklasse bereit, die von DbConnectionStringBuilder erbt.Each data provider includes a strongly typed connection string builder class that inherits from DbConnectionStringBuilder. In der folgenden Tabelle werden die .NET Framework-Datenanbieter und ihre jeweiligen ConnectionStringBuilder-Klassen aufgelistet.The following table lists the .NET Framework data providers and their associated connection string builder classes.

AnbieterProvider ConnectionStringBuilder-KlasseConnectionStringBuilder class
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

Angriffe durch das Einschleusen von VerbindungszeichenfolgenConnection String Injection Attacks

Zu einem Angriff durch Einschleusen von Verbindungszeichenfolgen kann es kommen, wenn die dynamische Zeichenfolgenverkettung verwendet wird, um auf Benutzereingabe basierende Verbindungszeichenfolgen zu konstruieren.A connection string injection attack can occur when dynamic string concatenation is used to build connection strings that are based on user input. Wenn die Zeichenfolge nicht validiert wird und schädlicher Text oder schädliche Zeichen nicht maskiert werden, kann ein Angreifer möglicherweise auf sicherheitsrelevante Daten oder andere Ressourcen auf dem Server zugreifen.If the string is not validated and malicious text or characters not escaped, an attacker can potentially access sensitive data or other resources on the server. So könnte ein Angreifer z. B. einen Angriff starten, indem er ein Semikolon, gefolgt von einem weiteren Wert, einfügt.For example, an attacker could mount an attack by supplying a semicolon and appending an additional value. Die Verbindungszeichenfolge wird mit einem "last one wins"-Algorithmus ("der Letzte gewinnt") analysiert, und der legitime Wert wird durch die feindliche Eingabe ersetzt.The connection string is parsed by using a "last one wins" algorithm, and the hostile input is substituted for a legitimate value.

Die ConnectionStringBuilder-Klassen sorgen dafür, dass das Rätselraten abgeschafft wird und die Verbindungszeichenfolgen vor Syntaxfehlern und Sicherheitslücken geschützt werden.The connection string builder classes are designed to eliminate guesswork and protect against syntax errors and security vulnerabilities. Sie stellen Methoden und Eigenschaften bereit, die den vom jeweiligen Datenanbieter zugelassenen bekannten Schlüssel/Wert-Paaren entsprechen.They provide methods and properties corresponding to the known key/value pairs permitted by each data provider. Jede Klasse unterhält eine feste Sammlung von Synonymen und ist in der Lage, ein Synonym in den entsprechenden bekannten Schlüsselnamen zu übersetzen.Each class maintains a fixed collection of synonyms and can translate from a synonym to the corresponding well-known key name. Die Gültigkeit der Schlüssel/Wert-Paare wird geprüft, und im Falle eines ungültigen Paars wird eine Ausnahme ausgelöst.Checks are performed for valid key/value pairs and an invalid pair throws an exception. Außerdem werden eingeschleuste Werte auf sichere Weise behandelt.In addition, injected values are handled in a safe manner.

Das folgende Beispiel zeigt, wie der SqlConnectionStringBuilder einen eingefügten Zusatzwert für die Initial Catalog-Einstellung behandelt.The following example demonstrates how the SqlConnectionStringBuilder handles an inserted extra value for the Initial Catalog setting.

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);  

Die Ausgabe zeigt, dass der SqlConnectionStringBuilder diesen Zusatzwert korrekt behandelt hat, indem er ihn in doppelte Anführungszeichen gesetzt und damit maskiert hat, statt ihn als neues Schlüssel/Wert-Paar an die Verbindungszeichenfolge anzuhängen.The output shows that the SqlConnectionStringBuilder handled this correctly by escaping the extra value in double quotation marks instead of appending it to the connection string as a new key/value pair.

data source=(local);Integrated Security=True;  
initial catalog="AdventureWorks;NewValue=Bad"  

Erstellen von Verbindungszeichenfolgen aus KonfigurationsdateienBuilding Connection Strings from Configuration Files

Wenn bestimmte Elemente einer Verbindungszeichenfolge vorab bekannt sind, können sie in einer Konfigurationsdatei gespeichert und zur Laufzeit zum Konstruieren einer vollständigen Verbindungszeichenfolge abgerufen werden.If certain elements of a connection string are known beforehand, they can be stored in a configuration file and retrieved at run time to construct a complete connection string. So ist es z. B. denkbar, dass zwar der Name der Datenbank, nicht aber der Name des Servers vorab bekannt ist.For example, the name of the database might be known in advance, but not the name of the server. Vielleicht möchten Sie auch, dass die Benutzer zur Laufzeit zwar einen Namen und ein Kennwort bereitstellen, aber keine anderen Werte in die Verbindungszeichenfolge einfügen können.Or you might want a user to supply a name and password at run time without being able to inject other values into the connection string.

Einer der überladenen Konstruktoren für einen Verbindungszeichenfolgen-Generator verwendet eine String als Argument, sodass Sie eine Teilverbindungszeichenfolge bereitstellen können, die dann zur Vervollständigung der Benutzereingabe verwendet wird.One of the overloaded constructors for a connection string builder takes a String as an argument, which enables you to supply a partial connection string that can then be completed from user input. Die Teilverbindungszeichenfolge kann in einer Konfigurationsdatei gespeichert und zur Laufzeit abgerufen werden.The partial connection string can be stored in a configuration file and retrieved at run time.

Hinweis

Der System.Configuration-Namespace ermöglicht den programmgesteuerten Zugriff auf Konfigurationsdateien unter Verwendung des WebConfigurationManager bei Webanwendungen und des ConfigurationManager bei Windows-Anwendungen.The System.Configuration namespace allows programmatic access to configuration files that use the WebConfigurationManager for Web applications and the ConfigurationManager for Windows applications. Weitere Informationen zum Arbeiten mit Verbindungszeichenfolgen und Konfigurationsdateien finden Sie unter Verbindungszeichenfolgen und Konfigurationsdateien.For more information about working with connection strings and configuration files, see Connection Strings and Configuration Files.

BeispielExample

Dieses Beispiel zeigt, wie Sie durch Festlegen der Eigenschaften DataSource, UserID und Password des SqlConnectionStringBuilder eine Teilverbindungszeichenfolge aus einer Konfigurationsdatei abrufen und vervollständigen können.This example demonstrates retrieving a partial connection string from a configuration file and completing it by setting the DataSource, UserID, and Password properties of the SqlConnectionStringBuilder. Die Konfigurationsdatei ist wie folgt definiert:The configuration file is defined as follows.

<connectionStrings>  
  <clear/>  
  <add name="partialConnectString"   
    connectionString="Initial Catalog=Northwind;"  
    providerName="System.Data.SqlClient" />  
</connectionStrings>  

Hinweis

Sie müssen in Ihrem Projekt einen Verweis auf System.Configuration.dll angeben, damit der Code ausgeführt wird.You must set a reference to the System.Configuration.dll in your project for the code to run.

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);
    }
}
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

Siehe auchSee also