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.
Penting
Microsoft menyarankan agar Anda menggunakan alur autentikasi paling aman yang tersedia. Jika Anda menyambungkan ke Azure SQL, Identitas Terkelola untuk sumber daya Azure adalah metode autentikasi yang direkomendasikan.
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 mungkin 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 System.Configuration namespace layanan 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 kelas yang tidak digunakan ConfigurationSettings lagi. 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 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 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 berdasarkan 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
Contoh: Mengambil String Koneksi menurut 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
Mengenkripsi Bagian File Konfigurasi Menggunakan Konfigurasi terproteksi
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.
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 waktu proses, .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 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.
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 dienkripsi dan disalin ke folder yang berisi file yang dapat dieksekusi dengan nama "MyApplication.exe.config".
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. (string koneksi hanya dapat didekripsi pada komputer tempat komputer dienkripsi.) Metode Save menyelesaikan operasi dan menyimpan perubahan.
Anda harus menambahkan referensi ke System.Configuration.dll
dalam proyek Anda agar kode dapat dijalankan.
Penting
Microsoft menyarankan agar Anda menggunakan alur autentikasi paling aman yang tersedia. Jika Anda menyambungkan ke Azure SQL, Identitas Terkelola untuk sumber daya Azure adalah metode autentikasi yang direkomendasikan.
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
. 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.