Abdurrahman KÖKEN | BLOG

just a developer... | Microsoft Student Partner

ASP.NET-Web Güvenliği #1

Şubat 16
by Abdurrahman Köken 16. Şubat 2010 18:30

Bu yazımda  web sitelerinde  kötü niyetli dosya çalıştırma ve bir asp.net projesinde  bu saldırılardan korunma yöntemlerinden birinden bahsedeceğim.Bir web uygulamamız olduğunu ve bu uygulamamızda üyelik sistemi olduğunu düşünelim.Bu siteye üye olan kullanıcılar FileUpload kontrolü ile profiline resim yüklediklerinde www.siteadi.com/users/pictures klasöründe saklansın.Peki kendini hacker sanan bir arkadaş FileUpload ile resim yüklemek yerine index.asp dosyasını yüklerse sonuç ne olur sizce?

 

 

 

 

 

 

 

Dosyayı yüklediğinde www.siteadi.com/users/pictures/index.asp şeklinde direkt bir erişim sağlayabilir ve kendi dosyasını sizin sisteminizde çalıştırabilir,tabi önleminizi almazsanızJHatta açılış sayfanızı silip kendi sayfasını bile koyabilir.Bu tarz olaylarla karşılaşmamak için dosya yükleme yapmadan önce gerekli işlemleri yapmalıyız ve System.IO ve System.Text.RegularExpressions isim alanlarını eklememiz lazım.İlk olarak yüklenecek dosyanın uzantısını almamız gerekiyor.Bunu Path.GetExtension metodu ile şu şekilde yapabilirsiniz.

string ext = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);

Dosya uzantısını aldıktan sonra uzantının hepsinin büyük ya da hepsinin küçük harfle başlayıp başlamadığını kontrol etmemiz gerekmektedir.Ben daha çok hepsini küçük harfe çevirerek kullanıyorum.ext = ext.ToLower();Son olarak Regex sınıfının IsMatch metodunu kullanarak yüklenecek dosyanın  istediğimiz dosya formatları ile uyuşup uyuşmadığını kontrol ediyoruz.Hepsi bu kadar!

if (Regex.IsMatch(ext,".jpg|.jpeg|.bmp|.gif"))

{    

    //TODO:Resim formatı uygun

}

else

{

  //TODO:Uygun olmayan dosya formatı

} 

Gördüğünüz gibi bu tip saldırıları önlemek oldukça kolay.Basit bir saldırı yöntemi olmasına rağmen üzücü sonuçlar yaratabilecek kadar da iyi bir yöntem.

Kolay gelsin!

MD5 İle İstemci Taraflı Yüksek Güvenlik

Mayıs 02
by Abdurrahman Köken 2. Mayıs 2009 16:06

Merhabalar.Bugün sizlere kendi projemde kullanmayı düşündüğüm istemci taraflı şifreleme yönteminden bahsedeceğim.Bu yöntemle istemci tarafında kullanıcı adı ve şifresini MD5 ile şifreleyerek  PageMethod ile sunucuda kolaylıkla karşılaştırma yapabilirsiniz.Öncelikle şifrelemeyi yapabilmemiz için gerekli MD5 javascript  kütüphanesini download etmelisiniz.İndirdiğiniz javascript dosyasını projemize import ettikten sonra sayfamıza iki tane textbox ve bir tane de html buton koyalım.Butonumuzun click olayına da şifreleme işlemini yapması  ve  kontrol etmesi için yazacağımız KontrolEt fonksiyonunu  ekliyoruz.

<asp:TextBox ID="TextBox1"runat="server"></asp:TextBox><br/>

<asp:TextBox ID="Şifre" runat="server"></asp:TextBox><br/>

<input id="gonder" type="button" value="Gönder" onclick="KontrolEt();"/> 

MD5 javascript kütüphanesini kullanabilmek için sayfamıza referans olarak eklemeyi unutmamalıyız.Referansımızı ekledikten sonra gelelim javascript fonksiyonunu yazmaya.

 <script type="text/javascript" language="javascript">

   function KontrolEt() {

   var pass = $get("Şifre").value;

   var md5 = hex_md5(pass);

       PageMethods.GirisKontrol(md5,Sonuc);

    }

   function Sonuc(sender) {

        alert(sender);

  

</script> 

GirisKontrol fonksiyonu ile şifrelemiş olduğumuz verileri sunucudaki bir metod ile kontrol edip metodun döndürdüğü değeri  Sonuc adındaki fonksiyonun parametresine gönderir.Yani GirisKontrol bizim sunucudaki bir metodumuzdur.Gelen sonuca göre istediğiniz işlemleri  yapabilirsiniz.Bizim sunucudaki metodumuzun geri dönüş tipi boolean olduğu için true ya da false değerinde ekrana uyarı verecektir.Tabiki sunucudaki metodumuzu çalıştırabilmemiz için önce EnablePageMethods özelliğinin True olması gerekiyor.

<asp:ScriptManager ID="ScriptManager1" EnablePageMethods="true" runat="server">

<Scripts>

<asp:ScriptReference Path="md5.js" />

</Scripts>

</asp:ScriptManager> 

Şimdi biraz da sunucu tarafında kod yazalım.İlk yapmamız gereken MD5 şifrelemeyi kullanabilmek için System.Security.Cryptography isim uzayını eklememiz gerekli.GirisKontrol metodumun da PageMethod olması için başına [System.Web.Services.WebMethod()] koymak yeterli olacaktır.

GirisKontrol metodumuz da aşağıdaki gibi tanımlıyoruz.

[System.Web.Services.WebMethod()]

public static bool GirisKontrol(string sifre)

{

    UTF8Encoding encoder = new UTF8Encoding();

  StringBuilder sb = new StringBuilder();

  MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();

  Byte[] gercekSifre=MD5.ComputeHash(encoder.GetBytes("1234"));

  for (int i = 0; i < gercekSifre.Length; i++)

  {

      sb.Append(gercekSifre[i].ToString("x2"));

  }

  if (sifre==sb.ToString())

    return true;

  else

    return false;

  }

GirisKontrol metoduna parametre olarak gelen şifrelenmiş veriyi kendi gerçek verimizi de MD5 ile şifreleyerek  karşılaştırıp geriye sonuç döndürüyoruz.Örnek demoyu linkten indirebilirsiniz.Teşekkürler.

MD5Demo.rar (5,32 kb)

Abdurrahman Köken-Recent Post