Başlangıç seviyesi için detaylı araştırdım ve türkçe olarak sunuyorum :)
"app.config", istediğimiz kurulum özellikleri içeren, küçük projelerde kendisine ihtiyaç duymadığımız, xml tabanlı dosyadır. Birtakım özellikleri kodun içine gömmek yerine, app.config dosyasına yazarız.
Yararları :
Ve böylelikle, veritabanı bağlantısı için gerekli olan connectionstring'i app.config dosyasından çekmiş olduk.
---------------------------------------------------------------------
Şimdi gelelim, güvenlik konusuna... Güvenlik için connectionstring'i şifreleyen methoda göz atalım..
"deneme.exe" projemizin adının exe dosyası, default olarak debug klasörünün içinde olduğu için path vermiyoruz. Bu exe'nin app.config dosyası için "configuration" nesnesi oluşturduk ve bu nesnedeki "connectionStrings" isimli bölüm için de "section" nesnesi oluşturduk.
Section nesnesinin korumalı ise korumasız hale, korumasız ise korumalı hale getiren kodu aşağıda verelim :
Son olarak config nesnemizi kaydedelim.
kendinize göre bu kodları projenize ekleyip, müşterinizin bilgisayarına kuracağınız zaman app.config dosyasını şifreleyip korumalı hale getirebilirsiniz.
Not: app.config dosyası debug edildikten sonra "uygulamaismi.exe.config" olarak "debug" klasörüne kaydedilir, oradan korumalı haline bakabilirsiniz.
Umarım yardımcı olabilmişimdir, kolay gelsin...
yorumlarınızı eksik etmeyin :))
"app.config", istediğimiz kurulum özellikleri içeren, küçük projelerde kendisine ihtiyaç duymadığımız, xml tabanlı dosyadır. Birtakım özellikleri kodun içine gömmek yerine, app.config dosyasına yazarız.
Yararları :
- Standartlaşmayı başarmıştır kendisi... Grup olarak çalıştığınız projelerde kolaylık sağlar, ya da yazdığınız bir projeye başkası devam etmek zorunda kaldığında, "Allah razı olsun" dedirtir :)
- Büyük projelerde kod tekrarını azaltır.
Başta görünen yararları bunlar. Özellikle veritabanı bağlantısı kurulacağı zaman "connectionstring"in app.config dosyasına yazıldığını yoğun olarak görmüşsünüzdür.
Burada aklıma şu takıldı :
"connectionstring"i değişmemiz gerektiği zaman ya da birden çok yerde kullanmamız gerektiği zaman yararlı(exe'ye dokunmadan app.config üzerindeki değişiklik ile işimiz hallolur); ama veritabanı bağlantısı bilgilerimi neden app.config dosyasına yazıp da bilgilere rahatça ulaşılmasına neden olayım ki ? ( Kodun içerisine gömdüğümüz zaman exe'yi ya da dll'i decompile edip biraz uğraştırmak varken :))
Microsoft amca, bunu tabi ki düşünüp "connectionstring"i şifreleme methotlarını da bizlerden eksik etmemiş.
Geçelim uygulamalara :
Öncelikle app.config ile connectionstring kullanımından başlayalım, daha sonra şifreleme işlemlerine geçelim:
- İlk olarak projenize System.Configuration referansını ekliyoruz ve kullanacağımız classta using System.Configuration; eklemeyi unutmuyoruz :)
- Ctrl + Shift + A yaparak açılan pencerede Application Configuration File seçip ismini değiştirmeden dosyamızı oluşturup projemize ekliyoruz.
- app.config dosyamızı aşağıdaki gibi kendi bilgilerinizle dolduruyorsunuz, username ve şifre kullanıyorsanız, connectionstringe ekleyin...
<configuration>
<connectionStrings>
<add name="MyDBConnectionString" connectionString="server=.\SQLEXPRESS;database=db_deneme;trusted_connection=true;connection timeout=30"/>
</connectionStrings>
</configuration>
- Kodumuzda çağırırken de ;
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDBConnectionString"].ConnectionString);
try
{
conn.Open();
}
catch (Exception)
{
MessageBox.Show("!!! Veritabanı bağlantısı kurulamadı.");
}
Ve böylelikle, veritabanı bağlantısı için gerekli olan connectionstring'i app.config dosyasından çekmiş olduk.
---------------------------------------------------------------------
Şimdi gelelim, güvenlik konusuna... Güvenlik için connectionstring'i şifreleyen methoda göz atalım..
Configuration config = ConfigurationManager.OpenExeConfiguration("deneme.exe");
ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection;
"deneme.exe" projemizin adının exe dosyası, default olarak debug klasörünün içinde olduğu için path vermiyoruz. Bu exe'nin app.config dosyası için "configuration" nesnesi oluşturduk ve bu nesnedeki "connectionStrings" isimli bölüm için de "section" nesnesi oluşturduk.
Section nesnesinin korumalı ise korumasız hale, korumasız ise korumalı hale getiren kodu aşağıda verelim :
if (section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
}
else
{
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
}
Son olarak config nesnemizi kaydedelim.
config.Save();
kendinize göre bu kodları projenize ekleyip, müşterinizin bilgisayarına kuracağınız zaman app.config dosyasını şifreleyip korumalı hale getirebilirsiniz.
Not: app.config dosyası debug edildikten sonra "uygulamaismi.exe.config" olarak "debug" klasörüne kaydedilir, oradan korumalı haline bakabilirsiniz.
Umarım yardımcı olabilmişimdir, kolay gelsin...
yorumlarınızı eksik etmeyin :))
abi eline sağlık güzel olmuş ama bu şifre kodları nereye yazılacak onu anlamadım.tam da aradığımı buldum.
YanıtlayınSilŞifre kodları derken veritabanı 'username' ve 'password'den mi bahsediyorsun?
YanıtlayınSilconnectionString="server=.\SQLEXPRESS;database=db_deneme;trusted_connection=true;connection timeout=30"
YanıtlayınSilyerine kendi connectionString'ini yazarsan hallolur
connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword" gibi... artik senin connectionString neyse :)
config section nesneleri ve
YanıtlayınSilif (section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
}
else
{
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
}
ve
config.Save();
bunları nereye yazacam app.config e mi?
Kodun içine yazıyorsunuz.
YanıtlayınSil// app.config dosyasındaki "connection string"i şifreleyerek korumaya alıyoruz
#region protectAppConfig
try
{
// Open the configuration file and retrieve
// the connectionStrings section.
Configuration config = ConfigurationManager.
OpenExeConfiguration("yourprogram.exe");
ConnectionStringsSection section =
config.GetSection("connectionStrings")
as ConnectionStringsSection;
// Eğer korumalı ise değiştirmiyoruz, ya da korumasız(okunabilir) hale getirebiliriz.
if (section.SectionInformation.IsProtected)
{
// Remove encryption.
// section.SectionInformation.UnprotectSection();
}
else // Korumasız ise koruma altına alıyoruz
{
// Encrypt the section.
section.SectionInformation.ProtectSection(
"DataProtectionConfigurationProvider");
}
// Save the current configuration.
config.Save();
}
catch (Exception ex)
{
MessageBox.Show("!!! Kurulum dosyası şifrelenemedi");
Environment.Exit(0);
}
#endregion
tamam hallettim ilginiz için sağolun.
YanıtlayınSilRica ederim, kolay gelsin...
SilKolay gelsin bu kodu login formunun load ına yazıyorum. Bir setup oluşturuyorum. Oluşturduğum setup ı pc ye kurup programın config dosyasına baktığımda connection string şifresiz halde oluyor. Ancak programı birkez çalıştırdıktan connectionlar şifreleniyor. Ben bu metodu nereye yazmalıyım ki dah ben programı kurarken connection stringlerimi şifrelesin ?
YanıtlayınSilTeşekkürler.
Saygılarımla..
Bu arada buldum eğer benim gibi birşeye takılanlar olursa diye affına sığınarak burada paylaşayım isterim.
YanıtlayınSilhttp://www.codeproject.com/Articles/18558/Encrypting-windows-application-connection-strings
Linkte gerekli adımları bulabilirsiniz.
Paylaştığın teşekkür ederim...
SilVb.net içinde detaylı anlatabilirmisiniz. Bu gerçekten önemli bir konu.
YanıtlayınSilSelamlar.
Merhaba,
YanıtlayınSilAnlatımınız için teşekkürler. Forms altına neler, app.config altına neler olduğu ile ilgili enson halini paylaşırmısınız.
la yapacağın işe o kadar uğraştım şifreledim ettim ertesi gün biraz düşündüm gittim başka program yazdım basit form app şifrelediğim exe nin adıyla xxx.exe şeklinde unprotect yaptım connection string göründü yani adam kendisi 3 satırdan oluşan form app yazsa benim exe adımı girip unprotect yapsa boku yedik hackerlara davetiye.
YanıtlayınSilTeşekkürler. Faydalı bir makale olmuş.
YanıtlayınSilTeşekürler Hocam ellerine sağlık
YanıtlayınSilHarika bilgilendirme olmuş. Elinize sağlık
YanıtlayınSilMerhaba,
YanıtlayınSilBu yöntemle local bilgisayarda sorunsuz çalışıyor, teşekkürler. Fakat program dosyalarını bir sunucu üzerinden paylaşıp çalıştırdığımda çalışmıyor. Bunun bir için çözüm önerisi var mı?