S obzirom da se celokupna konfiguarcija ASP.NET aplikacije nalazi u čistom obliku u web.config fajlu, uključujući i connection stringove, ovo svakako predstavlja sigurnosnu pretnju.
Na svu sreću .Net poseduje mehanizme kojima se ova pretnja lako može otkloniti. Postoje provajderi enkripcije koji mogu da izvrše šifromanje i dešifrovanje određenih web.config sekcija.
U primeru koji sledi, prikazana je upotreba RSAProtectedConfigurationProvider-a za šifrovanje i dešifrovanje connectionStrings sekcije.
Napravićemo novu ASP.NET MVC aplikaciju i izmeniti Index akciju HomeController-a tako da sadrži sledeći kod:
public ActionResult Index() { ViewBag.ConnectionStringsSection = GetConnectionStringsSection(); return View(); }
Zatim ćemo u HomeController-u napraviti privatnu metodu GetConnectionStringsSection:
private string GetConnectionStringsSection() { var config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); var xml = XDocument.Load(config.FilePath); var connectionStringsSection = xml.Descendants().SingleOrDefault(e => e.Name == "connectionStrings"); return connectionStringsSection != null ? connectionStringsSection.ToString() : string.Empty; }
A potom ćemo promeniti Index view tako da izgleda ovako:
<div> <h2>Connection string encryption example</h2> <p>@Html.ActionLink("Encrypt", "Encrypt")</p> <p>@Html.ActionLink("Decrypt", "Decrypt")</p> </div> <div> <h3>Connection Strings section</h3> <p>@ViewBag.ConnectionStringsSection</p> </div>
Enkripcija
Za enkripciju connectionStrings sekcije napravićemo Encryption akciju u HomeController-u:
public ActionResult Encrypt() { EncryptConnectionStrings(); return RedirectToAction("Index"); }
Suština je naravno u metodi EncryptConnectionStrings koja izgleda ovako:
public void EncryptConnectionStrings() { var config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); var section = config.ConnectionStrings; if (section.SectionInformation.IsProtected) return; section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider"); config.Save(); }
Dekripcija
Slično enkripciji, za dekripciju connectionStrings sekcije napravićemo Decryption akciju u HomeController-u:
public ActionResult Decrypt() { DecryptConnectionStrings(); return RedirectToAction("Index"); }
I naravno, suština je u metodi DecryptConnectionStrings koja izgleda ovako:
private string GetConnectionStringsSection() { var config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); var xml = XDocument.Load(config.FilePath); var connectionStringsSection = xml.Descendants().SingleOrDefault(e => e.Name == "connectionStrings"); return connectionStringsSection != null ? connectionStringsSection.ToString() : string.Empty; }
Treba imati na umu da su enkripcija i dekripcija skupe operacije, kao i da svaka izmena web.config fajla dovodi do restarta aplikacije.
Pored ovakvog, programskog načina enkripcije i dekripcije, moguće je ovo postići i pomoću aspnet_regiis.exe konzole. Više informacija o tome možete naći na MSDN-u.