Sql bağlantılarının güvenli bir şekilde saklanması için
internet üzerinde biraz araştırma yapmamla birlikte bu konu hakkında Türkçe kaynağın
eksikliği dikkatimi çekti. Bende bu konu hakkında bir deneme yazmak istedim.
Programlarımızı
yazarken sql bağlantı cümlemizi configuration dosyası içerisine çoğumuz
kaydediyoruzdur. Fakat configuration dosyası sıradan bir xml dosyası olduğu
için güvenlik anlamında hiçbir katkısı yoktur. Notepad kullanarak dahi app.config dosyasının
içerisindeki ayarları ve bağlantıları görebiliyoruz. Burada dikkat ederseniz sql kullanıcı adınız,
şifreniz ve server bilgileri de bulunabilir. Kötü niyetli kişiler bu tür
bilgileri kullanarak bilgi hırsızlığı yapabilir ya da bilgileri değiştirip silebilirler.
Bu durumla karşılaşmamak için size birkaç
öneride bulunacağım;
- · Sql admin kullanıcı adı şifremizi kullanarak kesinlikle bağlantımızı oluşturmayalım. Bu tür durumlar için yetkilerini minimum düzeyde olabilecek ihtiyaçlarımızı karşılayabilecek bir sql schema(kullanıcı) oluşturmamız bence en gerekli ve en önemli önlemdir.
- · İkincisi ise configuration dosyamızda bağlantı bilgilerimizi şifreleyerek de önlemlerimizi arttırabiliriz.
Ben ikinci durum için basit bir uygulama göstereceğim. Daha
ilerisi için internette araştırma yapabilir ve sizde paylaşarak Türkçe kaynakların
artmasında yardımcı olabilirsiniz.
Burada anlattığım yöntemi internetten bulduğum için linkini
vermek istiyorum.Ben üzerinde çok az değişiklik yaptım.
Amacımız:
configuration dosyası içerisinde <connectionStrings> tagı arasındaki
bağlantıyı şifrelemek.
Programımızı build ettiğimizde ya da çalıştırdığımızda “Debug”
klasörü altında projenin adıyla bir
Config dosyası oluşturmaktadır. Mesela benim proje ismim “EncryptConfiguration”
olduğu için
“EncryptConfiguration.exe.config” türünde ayarların kaydedildiği bir dosya türü
var. Bu dosya türünde eğer bağlantı cümlenizi oluşturduysanız notepad ile
açtığınızda görmeniz gerekir. Ben kendi bağlantı cümlemi gösteriyorum.
Önce bu yapıda bir form oluşturalım.<connectionStrings><add name="LinkSaverEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=ONUR-YAZILIM;initial catalog=LinkSaver;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" /></connectionStrings>
Burada ek olarak "OpenFileDialog" oluşturuldu.
Ve kullanılacak olan kütüphaneler şunlardır.
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using System.Configuration;=>"References" üzerinden eklemeniz gerekebilir.
Şimdi Programda kullanılacak metodları gösterelim.
/////////////////////////////////////////////////////
Kullanıdığımız ana metod bu.
public static void BaglantiCumlesiniSifrele(bool sifrelensinmi, string dosyaAdi)///////////////////////////////////////////////////////////////////////////////////////////////////////
{
Configuration configuration = null;
try
{
//Dosyayı açıp connectionString bölgesini arıyoruz.
configuration = ConfigurationManager.OpenExeConfiguration(dosyaAdi);
ConnectionStringsSection configSection = configuration.GetSection("connectionStrings") as ConnectionStringsSection;
if ((!(configSection.ElementInformation.IsLocked)) && (!(configSection.SectionInformation.IsLocked)))
{
if (sifrelensinmi && !configSection.SectionInformation.IsProtected)
{
//Bu satır dosyayı şifreleyecek
configSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
}
else if (!sifrelensinmi && configSection.SectionInformation.IsProtected)//encrypt is true so encrypt
{
//Bu satır dosyayı çözümleyecek
configSection.SectionInformation.UnprotectSection();
}
//Dosyayı Kaydedecek
configuration.Save();
Process.Start("notepad.exe", configuration.FilePath);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
BURADA HER İŞLEMİN SIRASIYLA METODUNU TANIMLADIK
//////////////////////////////////////////////////////////////////////////////////////////////////////private void DosyayiSifrele()
{
if (File.Exists(FileName))
{
BaglantiCumlesiniSifrele(true, FileName);
}
else
{
MessageBox.Show("Dosya bulunamadı");
}
}
////////////////////////////////////////////////////////
private void DosyayiCozumle()
{
if (File.Exists(FileName))
{
BaglantiCumlesiniSifrele(false, FileName);
}
else
{
MessageBox.Show("Dosya bulunamadı");
}
}
private void OpenFile()
{
openFileDialog1.Filter = ".Net Executables|*.exe";
openFileDialog1.FileName = "";
openFileDialog1.ShowDialog();
FileName = openFileDialog1.FileName;
txtSifreleme.Text = FileName;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
BURADA BUTONLARA GEREKLİ İŞLEVLERİ YÜKLEDİK.
/////////////////////////////////////////////////////////////////////////////////////////////////////private void btnAc_Click(object sender, EventArgs e)
{
OpenFile();
}
private void btnEncrypt_Click(object sender, EventArgs e)
{
DosyayiSifrele();
}
private void btnDecrypt_Click(object sender, EventArgs e)
{
DosyayiCozumle();
}
ARTIK PROGRAM ÇALIŞMAYA HAZIR.
TEK YAPMAMIZ GEREKEN UYGULANACAK PROGRAMI SEÇMEK BU KADAR.
BUNUN İÇİN DEBUG İÇERİSİNDE PROGRAMI SEÇİP ŞİFRELE DEMENİZ YETERLİ.
ŞİFRELEDİKTEN SONRA CONNECTION STRIN FORMATIMIZ ŞU ŞEKİLDE OLUR.
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">Ek Dosya:https://drive.google.com/file/d/0B3kuxcwuextldlVTY3FkaWV6bU0/view?usp=sharing
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAT/YbI8lzDkSbLPDGsYZ29QQAAAACAAAAAAAQZgAAAAEAACAAAADTZU6ibjz9C9V4xAJA+WgGcTh0wUnBi5V2JtD0m8C62AAAAAAOgAAAAAIAACAAAABz9YWZehg5NQyHtsvjVA/V47lcboiwT1sUn/FJsIOpojADAAD29m1aDf/FTnPtSpjOdYvQIQgV+7edjRv6ajlIbwgr98TK82QgbMmhrljE+EyPkYbWcgR5LhA0LHBmS0jGMTwC2RCvVWuY0nC+cq+ci1MN1d8HxF4FOh/3SuiGS3znREKaUjzlmTXivR1cxe79s9qofykTkO67z7LyXLliDIzD6dqx/Ijb/RgeRt5BOKP4l7Lk1ZZtu1hHbZ/h8EzTEdkwGiYumAy0X77IpMWAQq+L4wZmD6YMfmZmSdZxWWN2fnW4UftWZ0Da6O+TbF71lilMRlUVd9YIlmm+88sM98n9Ncsu8TfCXQzXMaVK0ToEI4EBVDYnMrYtN4qbza8ILGfZ0YCKjxrAzIEyaS3WeSlCeL6Vu9j6YscdTbR9ot8rS1PvIRFAK3MvjXJuuO+UtPqr6DJp/FtcGPbyxz2mqFFuVzlaloMax3v2GwTLTaZ0Vc36/ezkb9zIiJFXH/BXls+tTdi8h/M3tPaLnOQKRdQPNc+D93uO1Y4aTtatTyR9dHtp1oP7Tc7nWd64fU/uPlJRFyV0YN8kQlkoQEah/N6PZbsd5Xghe3tYvs7/MnQD6kAjhxJCqhZJEqqYljv2Nyz+YScz6wk8ZTXjLJSTJEW+O8iEL+4HaDxwSHoJRIwDQPU6wOe5e5ejUKSbYDhGNG40NmeftKBDh5l4rlkIoSRbDxecB1JITIHkSqKP5E4NyrYTjwUxPpSCkj/zdN7M5uh5H3C4KaAjzkVRIMyPf5dRr8kyc8WyHMQD/BbKCQ2TCZoxAjz7r2cc0UWX4zkWcvtdl19Qz07Iiu1ecUHtbmZJIAr2OOJ9W1HS5YVSuRdHEX5vB9VkAYv4OlBdVmv0oldi9r/fPMovRb2ys1PVeJRTWHl0Y/GuFkRN73TMtfntVTxevqVGcslTjxw9bY1X073wRTMvmjoRj9Oxn080f3j3w3hD5G47+aAurpXbm6haAYjvXWcHhVkuUN0NBsRMjoBg77v5HwyIz62b1r21HfhhX+pdOCrFKUChAx3mZUl2PFZau/XFGB5s1f3dn52ws9cphRjDg46CkMfSRbNGhWxE2upzqyFisG4iwggZJlm6Z+xAAAAAG6Cnf/IhB/i70VDnoDQf21iOtG5b+bUrM7UDFZQbCscvS6009P75/dfgLR1kJ6XJtYqdLSoORx/9zsVHvxdjqQ==</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>