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
--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
if($uzanti!='txt' && $uzanti!='doc' && $uzanti!='docx')
Ş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.
<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.