Aracılığıyla paylaş


Bağlantı Dizeleri ve Yapılandırma Dosyaları

Uygulamanızın koduna bağlantı dizesi eklemek güvenlik açıklarına ve bakım sorunlarına yol açabilir. Bir uygulamanın kaynak kodunda derlenen şifrelenmemiş bağlantı dizesi, Ildasm.exe (IL Disassembler) aracı kullanılarak görüntülenebilir. Ayrıca, bağlantı dizesi değişirse uygulamanızın yeniden derlenmiş olması gerekir. Bu nedenlerden dolayı, bağlantı dizesi'leri bir uygulama yapılandırma dosyasında depolamanızı öneririz.

Uygulama Yapılandırma Dosyalarıyla Çalışma

Uygulama yapılandırma dosyaları belirli bir uygulamaya özgü ayarlar içerir. Örneğin, bir ASP.NET uygulamasının bir veya daha fazla web.config dosyası olabilir ve Windows uygulamasının isteğe bağlı bir app.config dosyası olabilir. Yapılandırma dosyalarının adı ve konumu uygulamanın konağına bağlı olarak değişse de, yapılandırma dosyaları ortak öğeleri paylaşır.

connectionStrings Bölümü

Bağlan ion dizeleri, bir uygulama yapılandırma dosyasının yapılandırma öğesinin connectionStrings bölümünde anahtar/değer çiftleri olarak depolanabilir. Alt öğeler ekleme, temizleme ve kaldırmayı içerir.

Aşağıdaki yapılandırma dosyası parçası, bir bağlantı dizesi depolamak için şemayı ve söz dizimini gösterir. name özniteliği, çalışma zamanında alınabilmesi için bir bağlantı dizesi benzersiz olarak tanımlamak için sağladığınız bir addır. providerName, machine.config dosyasında kayıtlı olan .NET Framework veri sağlayıcısının sabit adıdır.

<?xml version='1.0' encoding='utf-8'?>  
  <configuration>  
    <connectionStrings>  
      <clear />  
      <add name="Name"
       providerName="System.Data.ProviderName"
       connectionString="Valid Connection String;" />  
    </connectionStrings>  
  </configuration>  

Not

Bağlantı dizesi bir bölümünü bir yapılandırma dosyasına kaydedebilir ve sınıfını DbConnectionStringBuilder kullanarak çalışma zamanında tamamlayabilirsiniz. Bu, bağlantı dizesi öğelerini önceden bilmediğiniz veya hassas bilgileri bir yapılandırma dosyasına kaydetmek istemediğiniz senaryolarda kullanışlıdır. Daha fazla bilgi için bkz. Bağlan ion String Builders.

Dış Yapılandırma Dosyalarını Kullanma

Dış yapılandırma dosyaları, tek bir bölümden oluşan bir yapılandırma dosyasının parçasını içeren ayrı dosyalardır. Ardından dış yapılandırma dosyasına ana yapılandırma dosyası tarafından başvurulur. connectionStrings bölümünü fiziksel olarak ayrı bir dosyada depolamak, uygulama dağıtıldıktan sonra bağlantı dizesi düzenlenebileceği durumlarda kullanışlıdır. Örneğin, standart ASP.NET davranışı, yapılandırma dosyaları değiştirildiğinde bir uygulama etki alanını yeniden başlatmaktır ve bu da durum bilgilerinin kaybolmasına neden olur. Ancak, bir dış yapılandırma dosyasının değiştirilmesi uygulamanın yeniden başlatılmasına neden olmaz. Dış yapılandırma dosyaları ASP.NET ile sınırlı değildir; Bunlar Windows uygulamaları tarafından da kullanılabilir. Ayrıca, dış yapılandırma dosyalarına erişimi kısıtlamak için dosya erişim güvenliği ve izinleri kullanılabilir. Çalışma zamanında dış yapılandırma dosyalarıyla çalışmak saydamdır ve özel kodlama gerektirmez.

bağlantı dizesi bir dış yapılandırma dosyasında depolamak için yalnızca connectionStrings bölümünü içeren ayrı bir dosya oluşturun. Ek öğe, bölüm veya öznitelik eklemeyin. Bu örnekte, dış yapılandırma dosyasının söz dizimi gösterilir.

<connectionStrings>  
  <add name="Name"
   providerName="System.Data.ProviderName"
   connectionString="Valid Connection String;" />  
</connectionStrings>  

Ana uygulama yapılandırma dosyasında, dış dosyanın tam adını ve konumunu belirtmek için configSource özniteliğini kullanırsınız. Bu örnek adlı connections.configbir dış yapılandırma dosyasına başvurur.

<?xml version='1.0' encoding='utf-8'?>  
<configuration>  
    <connectionStrings configSource="connections.config"/>  
</configuration>  

Çalışma Zamanında Bağlan Dizelerini Alma

.NET Framework 2.0, çalışma zamanında yapılandırma dosyalarından bağlantı dizesi almayı kolaylaştırmak için ad alanında yeni sınıflar System.Configuration kullanıma sunulmuştur. Bir bağlantı dizesi ada veya sağlayıcı adına göre program aracılığıyla alabilirsiniz.

Not

machine.config dosyası, Visual Studio tarafından kullanılan bağlantı dizesi içeren connectionStrings bölümünü de içerir. Windows uygulamasındaki app.config dosyasından sağlayıcı adına göre bağlantı dizesi alırken, önce machine.config dosyasındaki bağlantı dizesi, ardından app.config dosyasındaki girdiler yüklenir. connectionStrings öğesinden hemen sonra clear eklendiğinde, bellekteki veri yapısından devralınan tüm başvurular kaldırılır, böylece yalnızca yerel app.config dosyasında tanımlanan bağlantı dizesi dikkate alınır.

Yapılandırma Sınıfları ile Çalışma

.NET Framework 2.0'dan başlayarak, ConfigurationManager yerel bilgisayarda yapılandırma dosyalarıyla çalışırken, kullanım dışı bırakılmış ConfigurationSettingsyerine kullanılır. WebConfigurationManager ASP.NET yapılandırma dosyalarıyla çalışmak için kullanılır. Bir Web sunucusundaki yapılandırma dosyalarıyla çalışacak şekilde tasarlanmıştır ve system.web gibi yapılandırma dosyası bölümlerine programlı erişim sağlar.

Not

Çalışma zamanında yapılandırma dosyalarına erişmek için çağırana izin verilmesi gerekir; gerekli izinler uygulama türüne, yapılandırma dosyasına ve konuma bağlıdır. Daha fazla bilgi için bkz . Yapılandırma Sınıflarını Kullanma, WebConfigurationManager ASP.NET uygulamaları ve ConfigurationManager Windows uygulamaları için.

uygulamasını kullanarak ConnectionStringSettingsCollection uygulama yapılandırma dosyalarından bağlantı dizesi alabilirsiniz. Her biri ConnectionStringSettings connectionStrings bölümündeki tek bir girişi temsil eden bir nesne koleksiyonu içerir. Özellikleri bağlantı dizesi öznitelikleriyle eşlenerek adı veya sağlayıcı adını belirterek bir bağlantı dizesi almanıza olanak sağlar.

Özellik Açıklama
Name bağlantı dizesi adı. name özniteliğine Haritalar.
ProviderName Tam sağlayıcı adı. providerName özniteliğine Haritalar.
ConnectionString Bağlantı dizesi. connectionString özniteliğine Haritalar.

Örnek: Tüm Bağlan ion Dizelerini Listeleme

Bu örnek içinde yinelenir ConnectionStringSettingsCollection ve konsol penceresinde , ConnectionStringSettings.ProviderNameve ConnectionStringSettings.ConnectionString özelliklerini görüntülerConnectionStringSettings.Name.

Not

System.Configuration.dll tüm proje türlerine dahil değildir ve yapılandırma sınıflarını kullanmak için buna bir başvuru ayarlamanız gerekebilir. Belirli bir uygulama yapılandırma dosyasının adı ve konumu, uygulama türüne ve barındırma işlemine göre değişir.

using System.Configuration;

static class Program
{
    static void Main()
    {
        GetConnectionStrings();
        Console.ReadLine();
    }

    static void GetConnectionStrings()
    {
        ConnectionStringSettingsCollection settings =
            ConfigurationManager.ConnectionStrings;

        foreach (ConnectionStringSettings cs in settings)
        {
            Console.WriteLine(cs.Name);
            Console.WriteLine(cs.ProviderName);
            Console.WriteLine(cs.ConnectionString);
        }
    }
}
Imports System.Configuration

Class Program
    Shared Sub Main()
        GetConnectionStrings()
        Console.ReadLine()
    End Sub

    Private Shared Sub GetConnectionStrings()

        Dim settings As ConnectionStringSettingsCollection = _
            ConfigurationManager.ConnectionStrings

        If Not settings Is Nothing Then
            For Each cs As ConnectionStringSettings In settings
                Console.WriteLine(cs.Name)
                Console.WriteLine(cs.ProviderName)
                Console.WriteLine(cs.ConnectionString)
            Next
        End If
    End Sub
End Class

Örnek: Ada Göre Bağlan Ion Dizesi Alma

Bu örnekte, bir yapılandırma dosyasından adını belirterek bir bağlantı dizesi nasıl alınacağını gösterir. Kod, sağlanan giriş parametresini ConnectionStrings adla eşleştiren bir ConnectionStringSettings nesne oluşturur. Eşleşen ad bulunmazsa, işlev döndürür null (Nothing Visual Basic'te).

// Retrieves a connection string by name.
// Returns null if the name is not found.
static string? GetConnectionStringByName(string name)
{
    // Look for the name in the connectionStrings section.
    ConnectionStringSettings? settings =
        ConfigurationManager.ConnectionStrings[name];

    // If found, return the connection string (otherwise return null)
    return settings?.ConnectionString;
}
' Retrieves a connection string by name.
' Returns Nothing if the name is not found.
Private Shared Function GetConnectionStringByName( _
    ByVal name As String) As String

    ' Assume failure
    Dim returnValue As String = Nothing

    ' Look for the name in the connectionStrings section.
    Dim settings As ConnectionStringSettings = _
       ConfigurationManager.ConnectionStrings(name)

    ' If found, return the connection string.
    If Not settings Is Nothing Then
        returnValue = settings.ConnectionString
    End If

    Return returnValue
End Function

Örnek: Sağlayıcı Adına Göre Bağlan Ion Dizesi Alma

Bu örnekte, System.Data.ProviderName biçiminde sağlayıcı sabit adını belirterek bir bağlantı dizesi nasıl alınacağını gösterir. Kod aracılığıyla yinelenir ConnectionStringSettingsCollection ve ilk ProviderName bulunan için bağlantı dizesi döndürür. Sağlayıcı adı bulunamazsa, işlev (Nothing Visual Basic'te) döndürür null .

// Retrieve a connection string by specifying the providerName.
// Assumes one connection string per provider in the config file.
static string? GetConnectionStringByProvider(string providerName)
{
    // Get the collection of connection strings.
    ConnectionStringSettingsCollection? settings =
        ConfigurationManager.ConnectionStrings;

    // Walk through the collection and return the first
    // connection string matching the providerName.
    if (settings != null)
    {
        foreach (ConnectionStringSettings cs in settings)
        {
            if (cs.ProviderName == providerName)
            {
                return cs.ConnectionString;
            }
        }
    }
    return null;
}
' Retrieve a connection string by specifying the providerName.
' Assumes one connection string per provider in the config file.
Private Shared Function GetConnectionStringByProvider( _
    ByVal providerName As String) As String

    'Return Nothing on failure.
    Dim returnValue As String = Nothing

    ' Get the collection of connection strings.
    Dim settings As ConnectionStringSettingsCollection = _
        ConfigurationManager.ConnectionStrings

    ' Walk through the collection and return the first 
    ' connection string matching the providerName.
    If Not settings Is Nothing Then
        For Each cs As ConnectionStringSettings In settings
            If cs.ProviderName = providerName Then
                returnValue = cs.ConnectionString
                Exit For
            End If
        Next
    End If

    Return returnValue
End Function

Korumalı Yapılandırma Kullanarak Yapılandırma Dosyası Bölümlerini Şifreleme

ASP.NET 2.0, bir yapılandırma dosyasındaki hassas bilgileri şifrelemenizi sağlayan korumalı yapılandırma adlı yeni bir özellik kullanıma sunulmuştur. Öncelikli olarak ASP.NET için tasarlanmış olsa da korumalı yapılandırma, Windows uygulamalarında yapılandırma dosyası bölümlerini şifrelemek için de kullanılabilir. Korumalı yapılandırma özelliklerinin ayrıntılı açıklaması için bkz . Korumalı Yapılandırma Kullanarak Yapılandırma Bilgilerini Şifreleme.

Aşağıdaki yapılandırma dosyası parçası, şifrelendikten sonra connectionStrings bölümünü gösterir. configProtectionProvider, bağlantı dizesi şifrelemek ve şifresini çözmek için kullanılan korumalı yapılandırma sağlayıcısını belirtir. EncryptedData bölümü şifreleme metnini içerir.

<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">  
  <EncryptedData>  
    <CipherData>  
      <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAH2... </CipherValue>  
    </CipherData>  
  </EncryptedData>  
</connectionStrings>  

Şifrelenmiş bağlantı dizesi çalışma zamanında alındığında, .NET Framework Belirtilen sağlayıcıyı kullanarak CipherValue şifresini çözer ve uygulamanızın kullanımına sağlar. Şifre çözme işlemini yönetmek için ek kod yazmanız gerekmez.

Korumalı Yapılandırma Sağlayıcıları

Korumalı yapılandırma sağlayıcıları, .NET Framework ile sağlanan iki korumalı yapılandırma sağlayıcısını gösteren aşağıdaki parçada gösterildiği gibi yerel bilgisayardaki machine.config dosyasının configProtectedData bölümüne kaydedilir. Burada gösterilen değerler okunabilirlik için kesilmiştir.

<configProtectedData defaultProvider="RsaProtectedConfigurationProvider">  
  <providers>  
    <add name="RsaProtectedConfigurationProvider"
      type="System.Configuration.RsaProtectedConfigurationProvider" />  
    <add name="DataProtectionConfigurationProvider"
      type="System.Configuration.DpapiProtectedConfigurationProvider" />  
  </providers>  
</configProtectedData>  

Ek korumalı yapılandırma sağlayıcılarını machine.config dosyasına ekleyerek yapılandırabilirsiniz. Soyut temel sınıftan ProtectedConfigurationProvider devralarak kendi korumalı yapılandırma sağlayıcınızı da oluşturabilirsiniz. Aşağıdaki tabloda .NET Framework'e dahil edilen iki yapılandırma dosyası açıklanmaktadır.

Provider Açıklama
RsaProtectedConfigurationProvider Verileri şifrelemek ve şifresini çözmek için RSA şifreleme algoritmasını kullanır. RSA algoritması hem ortak anahtar şifrelemesi hem de dijital imzalar için kullanılabilir. İki farklı anahtar içerdiği için "ortak anahtar" veya asimetrik şifreleme olarak da bilinir. Web.config dosyasındaki bölümleri şifrelemek ve şifreleme anahtarlarını yönetmek için ASP.NET IIS Kayıt Aracı'nı (Aspnet_regiis.exe) kullanabilirsiniz. ASP.NET, dosyayı işlerken yapılandırma dosyasının şifresini çözer. ASP.NET uygulamasının kimliği, şifrelenmiş bölümleri şifrelemek ve şifresini çözmek için kullanılan şifreleme anahtarına okuma erişimine sahip olmalıdır.
DpapiProtectedConfigurationProvider Yapılandırma bölümlerini şifrelemek için Windows Veri Koruma API'sini (DPAPI) kullanır. Windows yerleşik şifreleme hizmetlerini kullanır ve makineye veya kullanıcıya özgü koruma için yapılandırılabilir. Makineye özgü koruma, aynı sunucuda bilgi paylaşması gereken birden çok uygulama için kullanışlıdır. Kullanıcı hesabına özgü koruma, paylaşılan barındırma ortamı gibi belirli bir kullanıcı kimliğiyle çalışan hizmetlerle kullanılabilir. Her uygulama, dosyalar ve veritabanları gibi kaynaklara erişimi kısıtlayan ayrı bir kimlik altında çalışır.

Her iki sağlayıcı da güçlü veri şifrelemesi sunar. Ancak, web grubu gibi birden çok sunucuda aynı şifrelenmiş yapılandırma dosyasını kullanmayı planlıyorsanız, verileri şifrelemek ve bunları başka bir sunucuya aktarmak için kullanılan şifreleme anahtarlarını dışarı aktarmanıza yalnızca RsaProtectedConfigurationProvider bu olanak sağlar. Daha fazla bilgi için bkz . Korumalı Yapılandırma RSA Anahtar Kapsayıcılarını İçeri ve Dışarı Aktarma.

Yapılandırma Sınıflarını Kullanma

Ad System.Configuration alanı, yapılandırma ayarlarıyla program aracılığıyla çalışmak için sınıflar sağlar. ConfigurationManager sınıfı makine, uygulama ve kullanıcı yapılandırma dosyalarına erişim sağlar. bir ASP.NET uygulaması oluşturuyorsanız, aynı işlevselliği sağlarken system.web'de bulunanlar< gibi ASP.NET uygulamalara özgü ayarlara da erişmenizi sağlayan sınıfını kullanabilirsinizWebConfigurationManager.>

Not

Ad System.Security.Cryptography alanı, verileri şifrelemek ve şifresini çözmek için ek seçenekler sağlayan sınıflar içerir. Korumalı yapılandırma kullanılarak kullanılamayan şifreleme hizmetlerine ihtiyacınız varsa bu sınıfları kullanın. Bu sınıflardan bazıları yönetilmeyen Microsoft CryptoAPI için sarmalayıcılardır, diğerleri ise tamamen yönetilen uygulamalardır. Daha fazla bilgi için bkz . Şifreleme Hizmetleri.

App.config Örneği

Bu örnekte, bir Windows uygulaması için app.config dosyasında connectionStrings bölümünün şifrelenmesine nasıl geçiş yapılacağını gösterilmektedir. Bu örnekte yordam, uygulamanın adını bağımsız değişken olarak alır, örneğin, "MyApplication.exe". App.config dosyası daha sonra şifrelenir ve "MyApplication.exe.config" adı altında yürütülebilir dosyayı içeren klasöre kopyalanır.

Not

bağlantı dizesi yalnızca şifrelendiği bilgisayarda çözülebilir.

Kod, app.config dosyasını düzenlemek üzere açmak için yöntemini kullanır OpenExeConfiguration ve GetSection yöntemi connectionStrings bölümünü döndürür. Kod daha sonra özelliğini denetler IsProtected ve şifrelenmemişse bölümünü şifrelemek için öğesini çağırır ProtectSection . UnprotectSection yöntemi, bölümün şifresini çözmek için çağrılır. Save yöntemi işlemi tamamlar ve değişiklikleri kaydeder.

Not

Kodun çalışması için System.Configuration.dll projenizde için bir başvuru ayarlamanız gerekir.

static void ToggleConfigEncryption(string exeFile)
{
    // Get the application path needed to obtain
    // the application configuration file.

    // Takes the executable file name without the
    // .config extension.
    var exePath = exeFile.Replace(".config", "");

    try
    {
        // Open the configuration file and retrieve
        // the connectionStrings section.
        Configuration config = ConfigurationManager.
            OpenExeConfiguration(exePath);

        var section =
            config.GetSection("connectionStrings")
            as ConnectionStringsSection;

        if (section != null)
        {
            if (section.SectionInformation.IsProtected)
            {
                // Remove encryption.
                section.SectionInformation.UnprotectSection();
            }
            else
            {
                // Encrypt the section.
                section.SectionInformation.ProtectSection(
                    "DataProtectionConfigurationProvider");
            }
        }
        // Save the current configuration.
        config.Save();

        Console.WriteLine("Protected={0}",
            section?.SectionInformation.IsProtected);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
Shared Sub ToggleConfigEncryption(ByVal exeConfigName As String)
    ' Takes the executable file name without the
    ' .config extension.
    Try
        ' Open the configuration file and retrieve 
        ' the connectionStrings section.
        Dim config As Configuration = ConfigurationManager. _
            OpenExeConfiguration(exeConfigName)

        Dim section As ConnectionStringsSection = DirectCast( _
            config.GetSection("connectionStrings"), _
            ConnectionStringsSection)

        If section.SectionInformation.IsProtected Then
            ' Remove encryption.
            section.SectionInformation.UnprotectSection()
        Else
            ' Encrypt the section.
            section.SectionInformation.ProtectSection( _
              "DataProtectionConfigurationProvider")
        End If

        ' Save the current configuration.
        config.Save()

        Console.WriteLine("Protected={0}", _
        section.SectionInformation.IsProtected)

    Catch ex As Exception
        Console.WriteLine(ex.Message)
    End Try
End Sub

Web.config Örneği

Bu örnekte yöntemini OpenWebConfigurationWebConfigurationManagerkullanır. Bu durumda, tilde kullanarak Web.config dosyasının göreli yolunu sağlayabileceğinizi unutmayın. Kod, sınıfına System.Web.Configuration bir başvuru gerektirir.

static void ToggleWebEncrypt()
{
    // Open the Web.config file.
    Configuration config = WebConfigurationManager.
        OpenWebConfiguration("~");

    // Get the connectionStrings section.
    var section =
        config.GetSection("connectionStrings")
        as ConnectionStringsSection;

    // Toggle encryption.
    if (section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
    }
    else
    {
        section.SectionInformation.ProtectSection(
            "DataProtectionConfigurationProvider");
    }

    // Save changes to the Web.config file.
    config.Save();
}
Shared Sub ToggleWebEncrypt()
    ' Open the Web.config file.
    Dim config As Configuration = WebConfigurationManager. _
      OpenWebConfiguration("~")

    ' Get the connectionStrings section.
    Dim section As ConnectionStringsSection = DirectCast( _
        config.GetSection("connectionStrings"), _
        ConnectionStringsSection)

    ' Toggle encryption.
    If section.SectionInformation.IsProtected Then
        section.SectionInformation.UnprotectSection()
    Else
        section.SectionInformation.ProtectSection( _
          "DataProtectionConfigurationProvider")
    End If

    ' Save changes to the Web.config file.
    config.Save()
End Sub

ASP.NET uygulamaların güvenliğini sağlama hakkında daha fazla bilgi için bkz . ASP.NET web sitelerinin güvenliğini sağlama.

Ayrıca bkz.