Verbinding maken ion String Builders

In eerdere versies van ADO.NET is het controleren van de compilatietijd van verbindingsreeks s met samengevoegde tekenreekswaarden niet opgetreden, zodat tijdens runtime een onjuist trefwoord is ArgumentExceptiongegenereerd. Elk van de .NET Framework-gegevensproviders ondersteunde verschillende syntaxis voor verbindingsreeks trefwoorden, waardoor het maken van geldige verbindingsreeks s moeilijk is als u dit handmatig doet. Om dit probleem op te lossen, heeft ADO.NET 2.0 nieuwe verbindingsreeks builders geïntroduceerd voor elke .NET Framework-gegevensprovider. Elke gegevensprovider bevat een sterk getypte verbindingsreeks builder-klasse die overneemt van DbConnectionStringBuilder. De volgende tabel bevat de .NET Framework-gegevensproviders en de bijbehorende verbindingsreeks builder-klassen.

Provider Verbinding maken ionStringBuilder-klasse
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

Verbinding maken ion-injectieaanvallen

Een verbindingsreeks injectieaanval kan optreden wanneer dynamische tekenreekssamenvoeging wordt gebruikt om verbindingsreeks s te bouwen die zijn gebaseerd op gebruikersinvoer. Als de tekenreeks niet is gevalideerd en er geen schadelijke tekst of tekens zijn ontsnapt, kan een aanvaller mogelijk toegang krijgen tot gevoelige gegevens of andere resources op de server. Een aanvaller kan bijvoorbeeld een aanval koppelen door een puntkomma op te leveren en een extra waarde toe te voegen. De verbindingsreeks wordt geparseerd met behulp van een algoritme 'last one wins' en de vijandige invoer wordt vervangen door een legitieme waarde.

De verbindingsreeks builderklassen zijn ontworpen om schattingen te elimineren en te beschermen tegen syntaxisfouten en beveiligingsproblemen. Ze bieden methoden en eigenschappen die overeenkomen met de bekende sleutel-/waardeparen die door elke gegevensprovider zijn toegestaan. Elke klasse onderhoudt een vaste verzameling synoniemen en kan vertalen van een synoniem naar de bijbehorende bekende sleutelnaam. Er worden controles uitgevoerd voor geldige sleutel-/waardeparen en een ongeldig paar genereert een uitzondering. Bovendien worden geïnjecteerde waarden op een veilige manier verwerkt.

In het volgende voorbeeld ziet u hoe een SqlConnectionStringBuilder ingevoegde extra waarde voor de Initial Catalog instelling wordt verwerkt.

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

In de uitvoer ziet u dat dit SqlConnectionStringBuilder correct is verwerkt door de extra waarde tussen dubbele aanhalingstekens te ontsnappen in plaats van deze toe te voegen aan de verbindingsreeks als een nieuw sleutel-/waardepaar.

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

Tekenreeksen bouwen Verbinding maken ion uit configuratiebestanden

Als bepaalde elementen van een verbindingsreeks vooraf bekend zijn, kunnen ze worden opgeslagen in een configuratiebestand en tijdens runtime worden opgehaald om een volledige verbindingsreeks te maken. De naam van de database kan bijvoorbeeld van tevoren bekend zijn, maar niet de naam van de server. Of u wilt dat een gebruiker tijdens runtime een naam en wachtwoord opgeeft zonder andere waarden in de verbindingsreeks te kunnen invoeren.

Een van de overbelaste constructors voor een verbindingsreeks-opbouwfunctie neemt een String argument op, waarmee u een gedeeltelijke verbindingsreeks kunt opgeven die vervolgens kan worden voltooid vanuit gebruikersinvoer. De gedeeltelijke verbindingsreeks kunnen worden opgeslagen in een configuratiebestand en tijdens runtime worden opgehaald.

Notitie

De System.Configuration naamruimte biedt programmatische toegang tot configuratiebestanden die gebruikmaken van de WebConfigurationManager voor webtoepassingen en de ConfigurationManager voor Windows-toepassingen. Zie Verbinding maken ion Strings and Configuration Files voor meer informatie over het werken met verbindingsreeks s en configuratiebestanden.

Opmerking

In dit voorbeeld ziet u hoe u een gedeeltelijke verbindingsreeks uit een configuratiebestand opzoekt en het voltooit door de DataSource, UserIDen Password eigenschappen van het SqlConnectionStringBuilderbestand in te stellen. Het configuratiebestand wordt als volgt gedefinieerd.

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

Notitie

U moet een verwijzing instellen naar het System.Configuration.dll in uw project om de code uit te voeren.

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 (settings != null)
    {
        // Retrieve the partial connection string.
        var 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(connectString)
            {
                // Supply the additional values.
                DataSource = dataSource,
                UserID = userName,
                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

Zie ook