Dosya Upload'da Dosya Türü Güvenliği

Çoğu sistemde sunucuya dosya yüklenilmesine ihtiyaç duyulur. Yer yer de yüklenilen dosyaların türleri yasaklanır. Peki dosya türü nasıl yasaklanır? Yasaklanması gereken dosya türü müdür yoksa adındaki uzantı yasağa yeterli mi? Amacım tür kısıtlamasında pek bilinmeyen daha doğrusu pek dikkat edilmeyen birşeyi yüzeye çıkarmak.


RFC (Request For Comments) adı ile bilinen internet standartları vardır. Bu standartlar benim bildiğim kadarı ile TCP/IP standartlarını belirlemekle başlamıştır. İlk RFC de ana bilgisayarlara aracı olarak kullanılan IMP(Interface Message Processor) lerin standardını belirliyor yanılmıyorsam. Her ne ise, bizim RFC ile alakamız şu, RFC 1867 standardı HTML'de form tabanlı dosya yüklemenin standardıdır. BURAYA TIKLAYARAK bahsi geçen standardı okuyabilirsiniz. Bu standardı okurken dikkatimi çeken nokta

RFC kodu
    --BbC04y Content-disposition: attachment; filename="file2.gif" Content-type: image/gif Content-Transfer-Encoding: binary ...contents of file2.gif... --BbC04y--

kısmıydı. Dosya adının, türünün yollandığını zaten biliyordum, encoding i tahmin etmek de zor değildi ama dosya türünün de dosya ile beraber yollandığını görmek çok tuhaftı. Bu gerçekten de böyleymiş ve bunu gördüğümde tekrar hayretler içinde kalmıştım o zaman. PHP de çok çok acemi iken dosya uzantılarını explode('.',$_FILE['dosya']['name'] ile bölüp edip son parçasına bakardım, daha sonra düzenli ifadeyi kullanmaya başlamıştım ve biraz daha kendimi iyi gördüğüm zamanlardan birinde $_FILE['dosya']['type'] ile dosyanın direk türünü almanın çok daha şık olacağına karar vermiştim. Bulabildiğim eski dosyalarımı sunucuma yerleştirdim ve denedim. İçeriği ve uzantısı PHP olan bir dosyanın türünü image/gif olarak gösterebildim. Bu da sunuculara yüklenilebilecek sheller, çalınacak bilgiler, zayi edilecek emekler demekti. Bu yüzden kodları buraya yazmıyorum ancak samimiyetime inanmanızı isterim ki, $_FILE['dosya']['type'] ile yapılan kontrol, kontrol falan değildir.

Peki ne yapmak gerekir sorusunun cevabı ise çok açık, acemiliğinize dönün. Dosya adını alın ve kontrol edin, hemen örnek teşkil etmesi için bir kod yazayım

PHP kodu
  1. $uzanti=end(explode(".",strtolower($_FILE['dosya']['name'])));
  2. if($uzanti!='txt' && $uzanti!='doc' && $uzanti!='docx')
  3. die('Bu dosya uzantsına izin verilmiyor');

Şeklindedir. Eğer php, asp, jsp gibi tarayıcı üzerinden çalıştırılabilecek dosyalarında yüklenmesini istiyorsanız, yükleme klasöründe muhakkak htaccess kullanın. Daha önce codeigniter ın aynı açığından bahsederken önerdiğim şu kodları htaccess dosyanıza ekleyerek bu dosyaların çalıştırılmamasını sağlayabilirsiniz.

HTACCESS kodu
    <FilesMatch "\.(php|jsp|asp|htm|html|shtml|cgi)$"> ForceType text/plain </FilesMatch>

Bu kodlar dosyalarınızın sunucu tarafından yorumlanmamasını, içeriğini öylece tarayıcıya yansıtmasını sağlar. Böylece tehlikeden uzak kalmış olursunuz.

Sonuç olarak; dosya türüne müdahele etmeye çalışmayın, dosya uzantısıyla çalışın, rahat edin.

İyi çalışmalar.

Dosya Upload'da Dosya Türü Güvenliği Oy Sayısı: 14 Puan: 7.00/ 10.00

Etiketler

php upload uzanti , php dosya upload uzanti , php upload dosya turu , php dosya turleri , php dosya yukleme guvenligi , upload guvenligi , php dosya upload kontrol , php upload dosya turleri , dosya turleri ,upload, , php dosya upload dosya tipi ,

Unknown Noname Anonymous20 Haziran 2011 Pazartesi 02:21:52


PHP Kodu Lazımdı Bana Teşekkürler Paylaşım İçin Bunu Scriptte Kullanacağım Tekrar Teşekkürler.


engin12 Ocak 2012 Perşembe 03:02:06


iyi de dosyanın uzantısını değiştirmek daha kolay. windowsta bile f2 tuşuna bas .php olan uzantıyı .gif yap olsun bitsin. bu kontrol kesinlikle koruma sağlamaz.


Gündüz Can YILMAZ12 Ocak 2012 Perşembe 08:45:16


Kesinlikle koruma sağlar. Sağlamayacak olsa zaten yazmazdım. uzantısı php olur ve sunucuya girerse facia olur, oysa doc olsa docx olsa, içeriği ne olursa olsun zarar vermez. gif te resim boyutunu kontrol edersiniz ama doc ta neyin neyini kontrol edeceksiniz?


engin13 Ocak 2012 Cuma 04:27:24


ben dosyanın türüne göre kontrol yapıyorum hep. birde .htaccess dosyasını kullanıyorum. senin söylediğin doğru aslında. ama mesela .gif formatında bir php ya da js dosyası attı adam. ie6 ile açarsa yine facia olmaz mı. ie6 bu şekilde kodların çalıştırılmasına izin veriyor bildiğim kadarıyla.


Gündüz Can YILMAZ13 Ocak 2012 Cuma 14:00:39


Yok hocam problem olmaz. Şöyle ki, ie den kaynaklı bir açık varsa dediğiniz gibi js kodları istemciye zarar verebilir ama sunucuya zarar verme ihtimali yok.

dosya upload edilirken resim türünün değiştirilmesi, yani bi kez gif e sonra geri kendi türüne çevrilmesi gibi bi işlem resim üzerindeki tüm zararlı kodları temizler. js de kalmaz php ama yüklenen dosya txt ise bu tarz bir koruma gerçekleşmez. txt yükletilen bi yerde, dosya türünü $_FILE['dosya']['type'] değişkenine bağlı kalarak kontrol eden site, bitmiş bi sitedir :)


engin13 Ocak 2012 Cuma 23:30:29


demek benim bi siteyi böyle hacklediler :D




Yorumunuz