ASP.Net uygulamalarında ConnectionString’i şifrelemek
ASP.Net uygulamalarımızda en çok kullandığımız yöntemlerden biri, connectionString’i web.config dosyası içerisinde tanımlamak. Bu sayede tekrardan derlemeye gerek kalmadan uygulamamızın veri tabanı sunucusunu değiştirme şansına sahip olmaktayız. Aynı zamanda tek yerden yapılan güncelleme kod içerisinde connectionstring arama derdinden bizi kurtarmakta. Bu özellik gerçekten güzel gibi ama bazen bu bağlantının meraklı gözlerden saklanması gerekebilir. Bunun için web.config içerisindeki bazı alanların şifrelenebilmesi mümkündür. Önce şifreleyebileceğimiz alanlara bakalım :
*connectionstrings
*processmodel
*runtime
*mscorlib
*startup
*system.runtime.remoting
*configprotecteddata
*satelliteassemblies
*cryptographysettings
*cryptonamemapping
*cryptoclasses
Şifreleme 2 ayrı yöntem ile yapılabilir.
1. Yöntem
İlk yöntemimiz aspnet_regiis.exe programını kullanmak. Bu yöntemde web.config dosyasını şifreleyeceğiniz sunucuya bağlı olmanız veya kendi test makinanızda çalışıyor olmanız lazım. Çünkü bu uygulamayı çalıştırabilmek için web sitesinin bulunduğu makinada Dos Komut İstemi açmanız gerekecek. Gelelim işlemin nasıl yapılacağına :
1. Önce web sitesinin bulunduğu makinada bir Dos Komut İstemi (Command Prompt) açalım. İşi sağlama almak için Yönetici olarak açmayı(Run as administrator) seçebiliriz. ( Start -> All Programs -> Accessories -> Command Prompt -> Sağ tık -> Run as Administrator )
2. Açılan pencerede
cd %WINDOWSDIR%\Microsoft.Net\Framework\v2.0.50727
veya
cd %WINDOWSDIR%\Microsoft.Net\Framework\v4.0.30319
yazıp enter’e basarız. böylece programın yer aldığı dizine varırız.
3. Artık şifreleme veya açma işine başlayabiliriz.
a) Şifreleme : aspnet_regiis.exe’nin -pe parametresini kullanarak yapılır. pe parametresinden sonra şifrelemek istediğiniz xml elemanını belirtirsiniz. Mesela connectionStrings gibi. Kullanılabilecek değerleri yukarıdaki listede vermiştim. Ayrıca buna ek olarak kullanmamız gereken bazı alt parametreler daha var :
-site parametresi : hangi sitenin web.config dosyasını şifreleyeceğimizi belirtir.
-app parametresi : site içindeki hangi uygulamanın şifreleneceğini belirtir.
-prov parametresi : şifreleme için kullanılacak provider’ı belirtir. bu parametre için DataProtectionConfigurationProvider değeri kullanılır.
Tam olarak yazımına bakarsak :
aspnet_regiis.exe -pe connectionStrings -prov DataProtectionConfigurationProvider -site "http://test.arastiriyorum.com" -app /
Böylece web.config dosyasının içindeki connectionStrings alanının şifrelendiğini görürüz.
b) Şifreyi Açma : aspnet_regiis.exe’nin -pd parametresini kullanarak yapılır. pd parametresinden sonra şifresini açmak istediğiniz xml elemanını belirtirsiniz. Mesela connectionStrings gibi. Kullanılabilecek değerleri yukarıdaki listede vermiştim. Ayrıca buna ek olarak kullanmamız gereken bazı alt parametreler daha var :
-site parametresi : hangi sitenin web.config dosyasını şifreleyeceğimizi belirtir.
-app parametresi : site içindeki hangi uygulamanın şifreleneceğini belirtir.
Tam olarak yazımına bakarsak :
aspnet_regiis.exe -pd connectionStrings -site "http://test.arastiriyorum.com" -app /
Böylece web.config dosyasının içindeki connectionStrings alanının şifresinin çözüldüğünü görürüz.
2. Yöntem
Kod ile aynı işlemi yapabilmekte mümkündür. Özellikle hosting gibi yerlerde bize makinada uzak bağlantı açma hakkı verilmez. Bu yüzden istediğimiz işlemleri dos komut istemi ile yapmamız mümkün olmaz. Böyle durumlarda kod ile de istediğimiz sonuca ulaşabiliriz. Öncelikle web.config dosyamızı açmamız gerekiyor. bunun için :
Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
kodunu kullanırız. Sonrada üzerinde şifreleme veya açma yapacağımız xml bölgesine ulaşmamız lazım.
ConfigurationSection section = config.GetSection("connectionStrings");
connectionStrings yerine yukarıdaki listede yer alan herhangi bir elemanı da kullanabilirsiniz. Bu noktada ilerlemeden önce section içinde veri olup olmadığını kontrol etmek gerekir. Eğer null değer içerir ise bir sonraki işlemimizde hata oluşur.
section nesnemizin özellikleri arasında yer alan section.SectionInformation.IsProtected özelliği bu noktada bizim için önemli. bu özellik bu alanın şifreli olup olmadığı bilgisini bize veriyor. Bunu şifreleme yaparken alanı tekrardan şifrelemeye çalışmamak için, veya açma yaparkende şifresiz bir alanı açmaya çalışmamak için kullanabiliriz.
Gerekli kontrolleri yaptıktan sonra artık alanı şifreleme veya açma işlemini yapabiliriz :
Şifrelemek için : section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
Açmak için : section.SectionInformation.UnprotectSection();
Son olarak değişikliğin dosyaya yansıtılması için : config.Save();
Böylece işlem tamamlanır. Bu işleri daha kolay yapabilmek için 2 ayrı metod haline getirirsek :
public static class CommonOperations
{
public static void ProtectSection(string sectionName, string provider)
{
Configuration config = WebConfigurationManager. OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
ConfigurationSection section = config.GetSection(sectionName);
if (section != null && !section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection(provider);
config.Save();
}
}
public static void UnProtectSection(string sectionName)
{
Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
ConfigurationSection section = config.GetSection(sectionName);
if (section != null && section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
config.Save();
}
}
}
Kullanırken ise :
Şifrelemek için : CommonOperations.ProtectSection("connectionStrings", "DataProtectionConfigurationProvider");
Açmak için : CommonOperations.UnProtectSection("connectionStrings");
şeklinde olabilir.
*connectionstrings
*processmodel
*runtime
*mscorlib
*startup
*system.runtime.remoting
*configprotecteddata
*satelliteassemblies
*cryptographysettings
*cryptonamemapping
*cryptoclasses
Şifreleme 2 ayrı yöntem ile yapılabilir.
1. Yöntem
İlk yöntemimiz aspnet_regiis.exe programını kullanmak. Bu yöntemde web.config dosyasını şifreleyeceğiniz sunucuya bağlı olmanız veya kendi test makinanızda çalışıyor olmanız lazım. Çünkü bu uygulamayı çalıştırabilmek için web sitesinin bulunduğu makinada Dos Komut İstemi açmanız gerekecek. Gelelim işlemin nasıl yapılacağına :
1. Önce web sitesinin bulunduğu makinada bir Dos Komut İstemi (Command Prompt) açalım. İşi sağlama almak için Yönetici olarak açmayı(Run as administrator) seçebiliriz. ( Start -> All Programs -> Accessories -> Command Prompt -> Sağ tık -> Run as Administrator )
2. Açılan pencerede
cd %WINDOWSDIR%\Microsoft.Net\Framework\v2.0.50727
veya
cd %WINDOWSDIR%\Microsoft.Net\Framework\v4.0.30319
yazıp enter’e basarız. böylece programın yer aldığı dizine varırız.
3. Artık şifreleme veya açma işine başlayabiliriz.
a) Şifreleme : aspnet_regiis.exe’nin -pe parametresini kullanarak yapılır. pe parametresinden sonra şifrelemek istediğiniz xml elemanını belirtirsiniz. Mesela connectionStrings gibi. Kullanılabilecek değerleri yukarıdaki listede vermiştim. Ayrıca buna ek olarak kullanmamız gereken bazı alt parametreler daha var :
-site parametresi : hangi sitenin web.config dosyasını şifreleyeceğimizi belirtir.
-app parametresi : site içindeki hangi uygulamanın şifreleneceğini belirtir.
-prov parametresi : şifreleme için kullanılacak provider’ı belirtir. bu parametre için DataProtectionConfigurationProvider değeri kullanılır.
Tam olarak yazımına bakarsak :
aspnet_regiis.exe -pe connectionStrings -prov DataProtectionConfigurationProvider -site "http://test.arastiriyorum.com" -app /
Böylece web.config dosyasının içindeki connectionStrings alanının şifrelendiğini görürüz.
b) Şifreyi Açma : aspnet_regiis.exe’nin -pd parametresini kullanarak yapılır. pd parametresinden sonra şifresini açmak istediğiniz xml elemanını belirtirsiniz. Mesela connectionStrings gibi. Kullanılabilecek değerleri yukarıdaki listede vermiştim. Ayrıca buna ek olarak kullanmamız gereken bazı alt parametreler daha var :
-site parametresi : hangi sitenin web.config dosyasını şifreleyeceğimizi belirtir.
-app parametresi : site içindeki hangi uygulamanın şifreleneceğini belirtir.
Tam olarak yazımına bakarsak :
aspnet_regiis.exe -pd connectionStrings -site "http://test.arastiriyorum.com" -app /
Böylece web.config dosyasının içindeki connectionStrings alanının şifresinin çözüldüğünü görürüz.
2. Yöntem
Kod ile aynı işlemi yapabilmekte mümkündür. Özellikle hosting gibi yerlerde bize makinada uzak bağlantı açma hakkı verilmez. Bu yüzden istediğimiz işlemleri dos komut istemi ile yapmamız mümkün olmaz. Böyle durumlarda kod ile de istediğimiz sonuca ulaşabiliriz. Öncelikle web.config dosyamızı açmamız gerekiyor. bunun için :
Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
kodunu kullanırız. Sonrada üzerinde şifreleme veya açma yapacağımız xml bölgesine ulaşmamız lazım.
ConfigurationSection section = config.GetSection("connectionStrings");
connectionStrings yerine yukarıdaki listede yer alan herhangi bir elemanı da kullanabilirsiniz. Bu noktada ilerlemeden önce section içinde veri olup olmadığını kontrol etmek gerekir. Eğer null değer içerir ise bir sonraki işlemimizde hata oluşur.
section nesnemizin özellikleri arasında yer alan section.SectionInformation.IsProtected özelliği bu noktada bizim için önemli. bu özellik bu alanın şifreli olup olmadığı bilgisini bize veriyor. Bunu şifreleme yaparken alanı tekrardan şifrelemeye çalışmamak için, veya açma yaparkende şifresiz bir alanı açmaya çalışmamak için kullanabiliriz.
Gerekli kontrolleri yaptıktan sonra artık alanı şifreleme veya açma işlemini yapabiliriz :
Şifrelemek için : section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
Açmak için : section.SectionInformation.UnprotectSection();
Son olarak değişikliğin dosyaya yansıtılması için : config.Save();
Böylece işlem tamamlanır. Bu işleri daha kolay yapabilmek için 2 ayrı metod haline getirirsek :
public static class CommonOperations
{
public static void ProtectSection(string sectionName, string provider)
{
Configuration config = WebConfigurationManager. OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
ConfigurationSection section = config.GetSection(sectionName);
if (section != null && !section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection(provider);
config.Save();
}
}
public static void UnProtectSection(string sectionName)
{
Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
ConfigurationSection section = config.GetSection(sectionName);
if (section != null && section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
config.Save();
}
}
}
Kullanırken ise :
Şifrelemek için : CommonOperations.ProtectSection("connectionStrings", "DataProtectionConfigurationProvider");
Açmak için : CommonOperations.UnProtectSection("connectionStrings");
şeklinde olabilir.
Yorumlar