19 Kasım 2012

app.config kullanımı, faydaları, güvenlik, connection string

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ı :
  • 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 :))


16 yorum:

  1. abi eline sağlık güzel olmuş ama bu şifre kodları nereye yazılacak onu anlamadım.tam da aradığımı buldum.

    YanıtlaSil
  2. Şifre kodları derken veritabanı 'username' ve 'password'den mi bahsediyorsun?

    YanıtlaSil
  3. connectionString="server=.\SQLEXPRESS;database=db_deneme;trusted_connection=true;connection timeout=30"

    yerine kendi connectionString'ini yazarsan hallolur

    connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword" gibi... artik senin connectionString neyse :)

    YanıtlaSil
  4. config section nesneleri ve

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

    ve

    config.Save();
    bunları nereye yazacam app.config e mi?

    YanıtlaSil
  5. Kodun içine yazıyorsunuz.

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

    YanıtlaSil
  6. tamam hallettim ilginiz için sağolun.

    YanıtlaSil
  7. Kolay 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 ?
    Teşekkürler.
    Saygılarımla..

    YanıtlaSil
  8. Bu arada buldum eğer benim gibi birşeye takılanlar olursa diye affına sığınarak burada paylaşayım isterim.
    http://www.codeproject.com/Articles/18558/Encrypting-windows-application-connection-strings

    Linkte gerekli adımları bulabilirsiniz.

    YanıtlaSil
  9. Vb.net içinde detaylı anlatabilirmisiniz. Bu gerçekten önemli bir konu.
    Selamlar.

    YanıtlaSil
  10. Merhaba,

    Anlatı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.

    YanıtlaSil
  11. 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ıtlaSil
  12. Teşekkürler. Faydalı bir makale olmuş.

    YanıtlaSil
  13. Teşekürler Hocam ellerine sağlık

    YanıtlaSil
  14. Harika bilgilendirme olmuş. Elinize sağlık

    YanıtlaSil

Bu Blogda Ara

İletişim

Ad

E-posta *

Mesaj *