12 Mayıs 2010 Çarşamba

FileUpload ve Güvenlik

ASP.NET uygulamarınızda kullanıcılardan dosya transferi yapmak istediğimizde FileUpload Asp.net sunucu kontrolü ile basit bir şekilde bu işlemi hallederiz.Basit bir örnek ile

if (FileUpload1.HasFile)
{
try
{
FileUpload1.SaveAs(Server.MapPath(".") + "/uploads/" + FileUpload1.FileName);
}
catch (Exception exp)
{
//hede höde
}
}

Tabi dosyaları saklayacağınız dizine yazma hakkı (ASP.NET kullanıcısına) vermeliyiz. Buraya kadar herşey doğal gibi görünse de unuttuğumuz küçük! bir ayrıntı var ki o da dosya boyutu ve dosya tipi. Öncelikle istemediğimiz dosya tiplerinin sunucumuza upload edilmesini önlemeliyiz. Kullanıcıdan sunucuya gönderilen dosya tipini

Response.Write(FileUpload1.PostedFile.ContentType);
//bir txt dosyasını gönderdiğinizde tarayıcımızda "text/plain",bir mp3 dosyası göndediğimizde ise "audio/mpeg" yazdıgını göreceğiz.

kod satırı ile öğrenebilir ve istemediğimiz tipdeki dosyaların sunucuya gönderilmesini engelleyebiriz.Peki gelelim dosya büyüklüğüne. Bu basit hali ile uygulamamızı kullanıcılara açtığımızda beklenmedik bir durum ile karşılaşma ihtimalimiz çok yüksek. Örneğin iş başvurusu yapılacak ve kullanıcılardan CV lerini word dökümanı olarak istemekteyiz. ContentType ile dosya tipini belirleyerek başka formatlardaki dosyaları sunucumuza gönderilmesini engelledik. E güzel!. Dosya boyu 5 mb olan bir kullanıcı CV sini göndermeye çalıştığında ne olur ? Görünürde "ne olabilir ki?" dediğimizde aslında sunucumuz - iis - bu işlemi iptal edecek ve hatta yukardaki kod örneğinde catch bloğumuz işe yaramayacaktır. Olan olmuştur. Sunucu bir request'deki varsayılan büyüklük olan 4MB sınırının aşıldığını tespit edecek ve bir hata oluşturacaktır (HttpUnhandledException). Peki Global.asax da biz bu hatayı yaklayıp inceleyelim.



Görüldüğü gibi yakalanan hatamızın InnerException nesnesine baktığımızda oluşturulan isteğin sınırı aştığını görebiliriz. Bu bizim için aslında dezavantajdan ziyada avantajdır.Çok büyük dosyalar yükleyerek sistemimizin yavaş çalışmasına neden olacak kötü niyetli arkaşlarımızı! birazcık üzecektir. Çözüm ise sunucumuzun gelen isteklerin boyutunun 4MB den büyük olmasına izin vermesi. Bunu da web.config doyasını aşağıdaki gibi düzenleyerek sağlayabiliriz.



Artık sunucumuz bu ayar ile maksimum istek boyutunu yaklaşık 16MB olarak kabul edecektir. Tabi burda dikkat etmemiz gereken en önemli nokta ise sunucumuzun bu uzun işlemler sırasında -16MB lik bir dosya kullanıcının bağlantısı yavaş olduğunu göz önüne alındığında yüklenmesi uzun bir işlem olacaktır - Normalde 90 sn boyunca gelen isteğe cevap veremezse IIS, isteği sonlandıracak ve timeout hatası gönderecektir. Bunu da engellemek için web.config dosyamızda aşağıdaki düzenlemeyi yaparız.



artık sunucumuz 90 sn değil 360 sn boyunca gelen isteği cevaplamak için "var gücü ile :) " çaba sarfedecektir ;) Tabi bu süreyi iyi analiz etmeli performans sorunları yaşamamak için bu sürenin uygulamanız çerçevesinde ne kadar süre olarak belirlenmesini iyi analiz etmek gerekir.

Kaynak: http://www.oguzyagmur.com/PermaLink,guid,a0237b88-624f-47ae-b26e-4edbbf324750.aspx

Hiç yorum yok:

Yorum Gönder