ASP.NET MVC'de XSS Açıklarını Giderme

  • Haziran 1, 2016
  • /
  • Yorum Yok

     Tüm website sahiplerinin paylaştığı muhtemelen tek ortak kaygı sitenin güvenliğidir sanırım. Çoğu zaman en bilindik bazı teknikleri uygulamak bize yeterli gelir. Ancak bazı durumlarda websitenizin güvenliğine daha fazla önem vermeniz gerekir(örneğin bir banka websitesi ise). Önlem almamız gereken en tehlikeli yöntemlerden birisi de XSS(Cross Site Scripting)'dir.

     XSS - Cross Site Scripting Nedir?

     Saldırganın veri girişi yaparken web sayfanıza ya da veritabanınıza kötü amaçlı kod enjekte etmesi XSS'dir. Bu kötü amaçlı kod Javascript, Vbscript veya diğer herhangi bir script kullanılarak yapılabilir. Saldırgan başarılı bir şekilde script'ini enjekte edebilirse; cookie'lere, session'lara, yerel dosyalara, veritabanına vs. erişim sağlayabilir.

     Aklımızda bulunması gereken XSS saldırılarını şöyle listeleyebiliriz :

     * Stored XSS (Persistent veya Type I diye de bilinir) : Kullanıcının girdiği datalar veritabanında tutuluyorsa bu saldırı türü oluşur.

     * Reflected XSS (Non-Persistent veya Type II diye de bilinir) : Kullanıcının girdiği datalar, sunucudan dönen hata mesajlarında kullanılıyorsa bu saldırı türü oluşur.

     * DOM based XSS (veya Type-0): Saldırganın DOM elementlerinde değişiklikler yaptığı saldırı türüdür. Stored XSS ve Reflected XSS'i de kapsar.

     XSS'e Karşı Önlem Almak

     XSS saldırılarını engellememizi sağlayacak iki yol var : 

     1 - XSS Açıklarını Kontrol Etmek : Websitenizde güvenlik testleri uygulamak olası XSS açıklarını görmenizi sağlar. Web Vulnerability Scanner tarzı uygulamalar bu konuda çok işinizi görecektir. Bu uygulamalar sitenizi baştan aşağı tarar ve bulduğu açıklara dair size raporlar sunar. Sunduğu raporda açıkların hangi urllerde ve hangi scriptlerden kaynaklandığını da belirttiği için açıkları hızlıca kapatmanızı sağlar.

     2 - XSS Saldırılarını Engellemek : Bunu bir MVC uygulaması örneği üzerinden konuşalım. Aşağıdaki gibi bir formda kullanıcı Html tagleri girdiğinde defaultta MVC sinir bozucu bir hata verir.

     MVC, kullanıcının girdiği datada Html elemanları kullanıldığı için bunu potansiyel tehlike olarak görür ve submit işlemini yarıda kesecek şekilde hata oluşturur.

     Ancak kullanıcılar Html elemanlarını her zaman kötü niyetle kullanmaz. Örneğin bir CMS(İçerik yönetim sistemi - Admin paneli) uygulaması yazarsanız, kullanıcının kaydettiği datalarda sıklıkla Html elemanları olmasını beklersiniz. Eğer kullanıcının Html elemanı kullanmasına izin vermek istiyorsanız bunu yapabileceğiniz iki yol vardır. 

     Model Seviyesi : 

 

public class Article
{
    public int ID { get; set; }
    public string Alias { get; set; }
    public string Headline { get; set; }
    public string Summary { get; set; }
    [AllowHtml]
    public string Text { get; set; }
}

     Controller Seviyesi :  

 

[ValidateInput(false)]
public ActionResult Save(FormCollection collection)

     Kullanıcının Html kullanmasına izin verdik ancak bu sefer de saldırılara açık olduk. Kullanıcı aşağıdaki gibi script'ler enjekte edebilir veritabanınıza. 

     MVC uygulamalarında hem kullanıcının Html kullanabilmesine izin verip hem de XSS saldırılarını engellemenin yolları var tabi ki. Bunun için kullanabileceğimiz en iyi yollardan birisi, çok kullanılan bir NuGet package olan AntiXSS.

     Projenize AntiXSS yükledikten sonra projenizin References tabinde iki yeni kütüphane göreceksiniz : AntiXssLibrary ve HtmlSantizationLibrary. Bundan sonrasında ise  kodunuza ufak eklemeler yapmanız gerekiyor.

 

[ValidateInput(false)]
public ActionResult Save(FormCollection collection)
{
    message.MessageText = Sanitizer.GetSafeHtmlFragment(message.MessageText);    
//datayı güvenli hale getiren kod
    db.Messages.Add(message);
    db.SaveChanges();
    
    return RedirectToAction("Index");
}

YORUMLAR
Tugce
Temmuz 12, 2019 10:57
Katılıyorum. Bunu uyarı mesajı olarak göstermeyip arkada gizli tutup yok etmek gerek.
Mahmut keleş
Ekim 5, 2018 15:37
Merhaba dediğiniz şekilde uyguladım denediğimde zararlı olabilecek değer algılandı. Şeklinde bir uyarı mesajı veriyor ne farkı kaldı ha yapsak ha yapmasak?
Email Adresi *
Görüntülenecek İsim *
Yorum *
Paylaş
  • f