|
C# Bilgi Sızdırma ve Uygunsuz Hata Yönetimi - C# Webmaster bilgi bankası, knowledge base Webmaster Araçları
AnaSayfa > C# > C# Bilgi Sızdırma ve Uygunsuz Hata Yönetimi |
| Kategori | : C# | Gönderen | : Admin | Tarih | : 2008-11-11 | Puan | : 6 | Katılımcı : 2 | Okunma | : 6153 | | | |
| | Kullanıcı Adı ve Parola kontrolü yapılan sistemlerde “Kullanıcı adınız yanlış” yada “Parolanız yanlış” gibi uyarı mesajlarının verilmesi bilgi sızdırma’ya örnektir. Saldırgan deneme yanılma yöntemi ile giriş yapmayı deneyebilir. “Parolanız yanlış” mesajı ile karşılaşınca da girdiği kullanıcı adının sistemde var olduğunu anlar ve deneme yanılma işlemlerinde içeriye girme şansı %50 artmış olur.
Bir örnek daha vererek “Bilgi Sızdırma” konusunu pekiştirelim.
Bir e-ticaret uygulamasının sahibi ürün stok bilgilerinin rekabet açısından gizli tutulmasını isteyebilir. Bu gibi durumlarda kullanıcının sipariş miktarı stoktaki ile karşılaştırılıp. “Sipariş etmek istediğiniz miktar stoklarımızda bulunmuyor” mesajı verirseniz kullanıcı yada rakip firmalar stok miktarlarınız hakkında bilgi edinmiş olur. Bu örnek web uygulamanız için bir tehlike arzetmez ama ticari bir bilginin dışarı sızmasına sebep olur.
Uygunsuz Hata Yönetimi’nde ise web uygulamanızda oluşan hatanın olduğu gibi ziyaretçiye gösterilmesidir.
Hata halinde verilen bilgiler geliştiriciye yöneliktir. Yazılım geliştiricisinin hatanın hangi sebepten kaynaklandığı hakkında bilgi verir. Bu yüzden hata anında meydana gelen bilginin ziyaretçiye gösterilmemesi gerekir.
Hata mesajlarından bir web uygulamasının nasıl bilgi sızdırabileceğini inceleyelim.
http://www.fabrikam.com/Vendor.aspx?CityID=1
Şeklinde çağrılan bir sayfada bayiler listesini çalıştıran SQL cümleciği şöyle oluşturulmış olsun :
"Select Name,Phone From Vendor Where CityID = " & Request.QueryString("CityID")
SQL Intection yöntemi ile içeri SQL kodu sızdırıyoruz ve olacakları inceleyelim.
http://www.fabrikam.com/Vendor.aspx?CityID= 1 UNION ALL Select FooColumn From FooTable
Yukarıdaki linki yazdığımızda oluşacak SQL cümlesini inceleyelim.
Select Name,Phone From Vendor Where CityID = 1
UNION ALL
Select FooColumn From FooTable
Pek mantılı bir sorgu olmadı. Dönen hata mesajını inceleyelim.
Invalid object name 'FooTable'
Demekki sistemde FooTable diye bir tablo yokmuş.
Bu işe yaramayan bir bilgi gibi gözükebilir ama unutmayın ki Edison ampülü bulmak için 1000 den fazla deney yapmıştı.
Saldırgan, deneme yanılma yöntemi ile Users isimli kullanıcı bilgilerinin bulunduğu tablo ismini buldu diyelim. Peki tablo ismini doğru tahmin ettiğini nasıl anlayacak ? Tabii ki hata mesajından.
URL
http://www.fabrikam.com/Vendor.aspx?CityID= 1 UNION ALL Select FooColumn From Users
SQL Cümlesi
Select Name,Phone From Vendor Where CityID = 1
UNION ALL
Select FooColumn From User
Hata Mesajı
Invalid column name 'FooColumn'
Hata Mesajı değişti. Artık tablo isminin değli kolon isminin yanlış olduğunu söylüyor. Demekki tablo ismini doğru tahmin etmişiz.
UNION ifadesini biraz açalım. Farklı iki tablodan gelen değerleri tek sonuç setinde geri döndürmeye yarayan bir SQL ifadesidir. Yalnız her iki Select ifadesinin de eşit sayıda ve aynı tipte değerler döndürmesi gerekir.
Select ifadelerinde kullanılan kolon sayıları farklı ise şöyle bir hata mesajı alabiliriz.
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
Bu seferde QueryString ile verdiğiniz Select ifadesindeki kolon isimlerini artrırmak gerekir.
http://www.fabrikam.com/Vendor.aspx?CityID= 1 UNION ALL Select FooColumn,FooColumn2 From FooTable
Bundan sonra yine deneme yanılma yöntemi ile User tablosundaki kolon isimlerini tahmin etmeye kalıyor.
Fazla uzatmadan sonuca gidelim :
URL
http://www.fabrikam.com/Vendor.aspx?CityID= 1 UNION ALL Select Username,Password From Users
SQL cümlesi
Select Name,Phone From Vendor Where CityID = 1
UNION ALL
Select Username,Password From User
Sonuç olarak Vendor.aspx te görüntülenen bayi listenin altında kullancıların username ve password bilgileride listeleniyo olacak.
Bu yüzdendir ki uygulamalarımızda oluşan hata mesajlarını ziyaretçilerimize göstermemeliyiz.
Aslında bu konuda ASP.NET geliştiricileri oldukça şanslı. Hata oluşabilecek kod kısımlarında try-catch mekanizmasını kullanabilirler, hata meydana geldiğinde ziyaretçiye sevimsiz hata ekranları yerine “Şu an sistemimizde bir hata oluştu” sayfasına yönlendirebilirler, uygulamanın neresinde olursa olsun oluşan hata loglayabilirler.
Hatanın meydana gelebileceği olası kod bloklarını try-catch blogu içine alınız. Bu veritabanında yapılan bir işlem yada mail gönderen bir kod bloğu olabilir.
try
{
// yapılacak işlemler
}
catch(Exception ex)
{
// hata anında yapılacaklar
// ex.Message ile hata ile ilgili bilgiye ulaşabilirsiniz.
// hata mesajını bir dosyaya keydedebilir
// yada mail atabilirsiniz.
}
Windows kullanıcıların kabusu “Mavi Ekran”ın psikolojimiz üzerinde etkisini düşünün. Aynı şekilde ziyaretçilerinizde abuk sabuk teknik terimlerin bulunduğu kırmızı ve büyük puntolu hata sayflarından pek hoşlanmazlar. Bu siteniz için hem bir prestij kaybıdır hemde ziyaretçinizi kaybetme tehlikesinide beraberinde getirir.
Her ne kadar try-catch kod bloğunu kullansakta tahmin edemediğimiz bir yerde oluşabilecek bir hata oluştuğunda kullanıcıyı sevimli bir hata sayfasına yönlendirmek için web.config te ufak bir değişiklik yapmamız kafi.
|
Yorumlar | Henüz Kimse Yorum Yapmamış, ilk yorumu siz ekleyin! | Yorum Ekleme Aparatı | Yorum Eklemek için lütfen sol menuden giris yapınız.. | Toplam 0 yorum listelendi. |
|