String Koneksi dan File Konfigurasi

Menyematkan string koneksi dalam kode aplikasi Anda dapat menyebabkan kerentanan keamanan dan masalah pemeliharaan. String koneksi tidak terenkripsi yang dikompilasi ke dalam kode sumber aplikasi dapat dilihat menggunakan alat Ildasm.exe (IL Disassembler). Selain itu, jika string koneksi pernah berubah, aplikasi Anda harus dikompresi ulang. Untuk alasan ini, sebaiknya simpan string koneksi dalam file konfigurasi aplikasi.

Melindungi File Konfigurasi Aplikasi

File konfigurasi aplikasi berisi pengaturan yang khusus untuk aplikasi tertentu. Misalnya, aplikasi ASP.NET dapat memiliki satu atau beberapa file web.config, dan aplikasi Windows dapat memiliki file app.config opsional. File konfigurasi berbagi elemen umum, meskipun nama dan lokasi file konfigurasi bervariasi tergantung pada host aplikasi.

Bagian connectionStrings

String koneksi dapat disimpan sebagai pasangan kunci/nilai di bagian connectionStrings dari elemen konfigurasi file konfigurasi aplikasi. Elemen turunan termasuk menambahkan, menghapus, dan menghapus.

Fragmen file konfigurasi berikut menunjukkan skema dan sintaks untuk menyimpan string koneksi. Atribut nama adalah nama yang Anda berikan untuk mengidentifikasi string koneksi secara unik sehingga dapat diambil pada durasi. providerName adalah nama invarian dari penyedia data .NET Framework, yang terdaftar dalam file machine.config.

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

Catatan

Anda dapat menyimpan bagian dari string koneksi dalam file konfigurasi dan menggunakan kelas DbConnectionStringBuilder untuk menyelesaikannya pada durasi. Ini berguna dalam skenario di mana Anda tidak tahu elemen string koneksi sebelumnya, atau ketika Anda tidak ingin menyimpan informasi sensitif dalam file konfigurasi. Untuk informasi selengkapnya, lihat Pembuat String Koneksi.

Menggunakan File Konfigurasi Eksternal

File konfigurasi eksternal adalah file terpisah yang berisi fragmen file konfigurasi yang terdiri dari satu bagian. File konfigurasi eksternal kemudian dirujuk oleh file konfigurasi utama. Menyimpan bagian connectionStrings dalam file yang terpisah secara fisik berguna dalam situasi di mana string koneksi dapat diedit setelah aplikasi disebarkan. Misalnya, perilaku ASP.NET standar adalah memulai ulang domain aplikasi saat file konfigurasi dimodifikasi, yang mengakibatkan informasi status hilang. Namun, memodifikasi file konfigurasi eksternal tidak menyebabkan aplikasi dimulai ulang. File konfigurasi eksternal tidak terbatas pada ASP.NET; mereka juga dapat digunakan oleh aplikasi Windows. Selain itu, keamanan dan izin akses file dapat digunakan untuk membatasi akses ke file konfigurasi eksternal. Bekerja dengan file konfigurasi eksternal pada waktu proses transparan, dan tidak memerlukan pengodean khusus.

Untuk menyimpan string koneksi dalam file konfigurasi eksternal, buat file terpisah yang hanya berisi bagian connectionStrings. Jangan sertakan elemen, bagian, atau atribut tambahan apa pun. Contoh ini memperlihatkan sintaks untuk file konfigurasi eksternal.

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

Dalam file konfigurasi aplikasi utama, Anda menggunakan atribut configSource untuk menentukan nama dan lokasi file eksternal yang sepenuhnya memenuhi syarat. Contoh ini mengacu pada file konfigurasi eksternal bernama connections.config.

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

Mengambil String Koneksi pada Run Time

.NET Framework 2.0 memperkenalkan kelas baru di namespace layanan System.Configuration untuk menyederhanakan pengambilan string koneksi dari file konfigurasi pada waktu proses. Anda dapat mengambil string koneksi secara terprogram berdasarkan nama atau menurut nama penyedia.

Catatan

File machine.config juga berisi bagian connectionStrings, yang berisi string koneksi yang digunakan oleh Visual Studio. Saat mengambil string koneksi berdasarkan nama penyedia dari file app.config dalam aplikasi Windows, string koneksi di machine.config dimuat terlebih dahulu, lalu entri dari app.config. Menambahkan jelas segera setelah elemen connectionStrings menghapus semua referensi yang diwariskan dari struktur data dalam memori, sehingga hanya string koneksi yang ditentukan dalam file app.config lokal yang dipertimbangkan.

Bekerja dengan Kelas Konfigurasi

Dimulai dengan .NET Framework 2.0, ConfigurationManager digunakan saat bekerja dengan file konfigurasi di komputer lokal, menggantikan ConfigurationSettings. WebConfigurationManager digunakan untuk bekerja dengan file konfigurasi ASP.NET. Ini dirancang untuk bekerja dengan file konfigurasi di server Web, dan memungkinkan akses terprogram ke bagian file konfigurasi seperti system.web.

Catatan

Mengakses file konfigurasi pada durasi memerlukan pemberian izin kepada pemanggil; izin yang diperlukan bergantung pada jenis aplikasi, file konfigurasi, dan lokasi. Untuk informasi selengkapnya, lihat Menggunakan Kelas Konfigurasi dan WebConfigurationManager untuk aplikasi ASP.NET, dan ConfigurationManager untuk aplikasi Windows.

Anda dapat menggunakan ConnectionStringSettingsCollection untuk mengambil string koneksi dari file konfigurasi aplikasi. Ini berisi kumpulan objek ConnectionStringSettings, yang masing-masing mewakili satu entri di bagian connectionStrings. Propertinya memetakan ke atribut string koneksi, memungkinkan Anda untuk mengambil string koneksi dengan menentukan nama atau nama penyedia.

Properti Deskripsi
Name Nama grup koneksi. Memetakan ke atribut nama.
ProviderName Nama server yang sepenuhnya memenuhi syarat. Memetakan ke atribut providerName.
ConnectionString String koneksi. Memetakan ke atribut connectionString.

Contoh: Mencantumkan Semua String Koneksi

Contoh ini mengulangi melalui ConnectionStringSettingsCollection dan menampilkan properti ConnectionStringSettings.Name, ConnectionStringSettings.ProviderName, dan ConnectionStringSettings.ConnectionString di jendela konsol.

Catatan

System.Configuration.dll tidak disertakan dalam semua jenis proyek, dan Anda mungkin perlu mengatur referensi ke dalamnya untuk menggunakan kelas konfigurasi. Nama dan lokasi file konfigurasi aplikasi tertentu bervariasi menurut jenis aplikasi dan proses hosting.

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

Contoh: Mengambil String Koneksi dengan Nama

Contoh ini menunjukkan cara mengambil string koneksi dari file konfigurasi dengan menentukan namanya. Kode membuat objek ConnectionStringSettings, mencocokkan parameter input yang disediakan dengan nama ConnectionStrings. Jika tidak ada nama yang cocok yang ditemukan, fungsi akan mengembalikan null (Nothing dalam Visual Basic).

// 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

Mengambil String Koneksi berdasarkan Nama Penyedia

Contoh ini menunjukkan cara mengambil string koneksi dengan menentukan nama penyedia-invariant dalam format System.Data.ProviderName. Kode melakukan iterasi melalui ConnectionStringSettingsCollection dan mengembalikan string koneksi ProviderName untuk yang pertama ditemukan. Jika nama penyedia tidak ditemukan, fungsi akan kembali null (Nothing dalam Visual Basic).

// 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

Enkripsi bagian file konfigurasi dengan konfigurasi yang dilindungi

ASP.NET 2.0 memperkenalkan fitur baru, yang disebut konfigurasi yang dilindungi, yang memungkinkan Anda mengenkripsi informasi sensitif dalam file konfigurasi. Meskipun terutama dirancang untuk aplikasi ASP.NET, konfigurasi yang dilindungi juga dapat digunakan untuk mengenkripsi bagian file konfigurasi di aplikasi Windows. Untuk deskripsi terperinci mengenai kemampuan konfigurasi baru yang dilindungi, lihat Mengenkripsi Informasi Konfigurasi Menggunakan Konfigurasi Terlindung.

Fragmen file konfigurasi berikut menunjukkan bagian connectionStrings setelah dienkripsi. configProtectionProvider menentukan penyedia konfigurasi terproteksi yang digunakan untuk mengenkripsi dan mendekripsi string koneksi. Bagian EncryptedData berisi teks cipher.

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

Ketika string koneksi terenkripsi diambil pada durasi, .NET Framework menggunakan penyedia yang ditentukan untuk mendekripsi CipherValue dan membuatnya tersedia untuk aplikasi Anda. Anda tidak perlu menulis kode tambahan apa pun untuk mengelola proses dekripsi.

Penyedia Konfigurasi terlindungi

Penyedia konfigurasi yang dilindungi terdaftar di bagian configProtectedData dari file machine.config di komputer lokal, seperti yang ditunjukkan dalam fragmen berikut, yang menunjukkan dua penyedia konfigurasi yang dilindungi yang disediakan dengan .NET Framework. Nilai yang diperlihatkan di sini telah dipotong untuk keterbacaan.

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

Anda dapat mengonfigurasi penyedia konfigurasi tambahan yang dilindungi dengan menambahkannya ke file machine.config. Anda juga dapat membuat penyedia konfigurasi yang dilindungi sendiri dengan mewarisi dari kelas dasar ProtectedConfigurationProvider abstrak. Tabel berikut ini menjelaskan dua file konfigurasi yang disertakan dengan .NET Framework.

Penyedia Deskripsi
RsaProtectedConfigurationProvider Menggunakan algoritma enkripsi RSA untuk mengenkripsi dan mendekripsi data. Algoritma RSA dapat digunakan untuk enkripsi kunci publik dan tanda tangan digital. Ini juga dikenal sebagai "kunci umum" atau enkripsi asimetris karena menggunakan dua kunci yang berbeda. Anda dapat menggunakan Alat Pendaftaran IIS ASP.NET (Aspnet_regiis.exe) untuk mengenkripsi bagian dalam file Web.config dan mengelola kunci enkripsi. ASP.NET mendekripsi file konfigurasi saat memproses file. Identitas aplikasi ASP.NET harus memiliki akses baca ke kunci enkripsi yang digunakan untuk mengenkripsi dan mendekripsi bagian terenkripsi.
DpapiProtectedConfigurationProvider Menggunakan Windows Data Protection API (DPAPI) untuk mengenkripsi bagian konfigurasi. Ini menggunakan Windows layanan kriptografi bawaan dan dapat dikonfigurasi untuk perlindungan khusus mesin atau akun pengguna. Perlindungan khusus komputer berguna untuk beberapa aplikasi di server yang sama yang perlu berbagi informasi. Perlindungan khusus akun pengguna dapat digunakan dengan layanan yang berjalan dengan identitas pengguna tertentu, seperti lingkungan hosting bersama. Setiap aplikasi berjalan di bawah identitas terpisah yang membatasi akses ke sumber daya seperti file dan database.

Kedua penyedia menawarkan enkripsi data yang kuat. Namun, jika Anda berencana untuk menggunakan file konfigurasi terenkripsi yang sama di beberapa server, seperti peternakan Web, hanya RsaProtectedConfigurationProvider yang memungkinkan Anda mengekspor kunci enkripsi yang digunakan untuk mengenkripsi data dan mengimpornya di server lain. Untuk informasi selengkapnya, lihat Mengimpor dan Mengekspor Kontainer Kunci RSA Konfigurasi Terproteksi.

Menggunakan Kelas Konfigurasi

Namespace System.Configuration menyediakan kelas untuk bekerja dengan pengaturan konfigurasi secara terprogram. Kelas ConfigurationManager ini menyediakan akses ke file konfigurasi komputer, aplikasi, dan pengguna. Jika Anda membuat aplikasi ASP.NET, Anda dapat menggunakan kelas WebConfigurationManager, yang menyediakan fungsionalitas yang sama sekaligus memungkinkan Anda mengakses pengaturan yang unik untuk aplikasi ASP.NET, seperti yang ditemukan di <system.web>.

Catatan

Namespace System.Security.Cryptography berisi kelas yang menyediakan opsi tambahan untuk mengenkripsi dan mendekripsi data. Gunakan kelas ini jika Anda memerlukan layanan kriptografi yang tidak tersedia menggunakan konfigurasi yang dilindungi. Beberapa kelas adalah pembungkus untuk Microsoft CryptoAPI yang tidak dikelola, sementara yang lain adalah implementasi terkelola. Untuk informasi selengkapnya, lihat Layanan Kriptografi.

Contoh App.config

Contoh ini menunjukkan cara beralih mengenkripsi bagian connectionStrings dalam file app.config untuk aplikasi Windows. Dalam contoh ini, prosedur mengambil nama aplikasi sebagai argumen, misalnya, "MyApplication.exe". File app.config kemudian akan dienkripsi dan disalin ke folder yang berisi file yang dapat dieksekusi dengan nama "MyApplication.exe.config".

Catatan

String koneksi hanya dapat didekripsi pada komputer tempat string tersebut dienkripsi.

Kode menggunakan metode OpenExeConfiguration untuk membuka file app.config untuk pengeditan, dan metode GetSection mengembalikan bagian connectionStrings. Kode kemudian memeriksa properti IsProtected, memanggil ProtectSection untuk mengenkripsi bagian jika tidak dienkripsi. Metode UnprotectSection ini dipanggil untuk mendekripsi bagian. Metode Save menyelesaikan operasi dan menyimpan perubahan.

Catatan

Anda harus mengatur referensi ke System.Configuration.dll di proyek Anda agar kode dapat dijalankan.

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

Contoh Web.config

Contoh ini menggunakan metode OpenWebConfiguration dari WebConfigurationManager. Perhatikan bahwa dalam hal ini Anda dapat menyediakan jalur relatif ke file Web.config dengan menggunakan tilde. Kode memerlukan referensi ke kelas System.Web.Configuration.

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

Untuk informasi selengkapnya tentang mengamankan aplikasi ASP.NET, lihat Mengamankan situs web ASP.NET.

Lihat juga