
Dosya Yükleme Güvenliği: Yüklenen Dosyayı Doğrulamak ve Saklamak
Sitenize bir profil fotoğrafı yükleme alanı eklediniz. Birkaç hafta sonra sunucuda tanımadığınız bir dosya çalışıyor ve site kontrolünüzden çıkmış durumda. Yükleme alanları, paylaşımlı barındırmada en sık istismar edilen noktadır.
Bu yazı, dosya yüklemenin güvenli kurulumunu ele alıyor.
Uzantı Kontrolünün Yetersizliği
İlk akla gelen çözüm dosya adına bakmaktır:
- Dosya adı okunur.
- Uzantı ayrıştırılır.
- İzinli listede varsa kabul edilir.
Bu yaklaşım tek başına yetersizdir çünkü kontrol edilen bilgi kullanıcıya aittir: dosya adı ve uzantısı tamamen yükleyen tarafından belirlenir — bir betik dosyasını resim uzantısıyla adlandırmak saniyeler alır ve uzantı kontrolü bunu fark etmez.
Aynı şekilde tarayıcının bildirdiği içerik türü de kullanıcı tarafından değiştirilebilir.
Bu iki bilgi ipucu olarak kullanılabilir ama güvenlik kararı bunlara dayandırılamaz.
Gerçek doğrulama, dosyanın içeriğine bakmayı gerektirir.
İçerik Doğrulama
| Kontrol | Güvenilirlik |
|---|---|
| Dosya adı uzantısı | Güvenilmez |
| Tarayıcının bildirdiği tür | Güvenilmez |
| Dosya içeriğinden tür tespiti | İyi |
| Görsel olarak yeniden işleme | En güçlü |
Dördüncü satır görseller için en sağlam yöntemdir: yüklenen görseli okuyup yeniden kaydetmek, içine gizlenmiş her türlü kodu yok eder — çünkü çıktı dosyası sizin kütüphaneniz tarafından sıfırdan üretilir.
Bu işlem aynı zamanda boyut küçültme fırsatı da verir.
Üçüncü satır ise diğer dosya türleri için temel kontroldür ve dosyanın ilk baytlarına bakar.
Ancak bu kontrol de tek başına yeterli değildir; saklama biçimi en az onun kadar önemlidir.
Nerede Saklamalı
- Web kök dizini dışına kaydedin.
- Sunum için bir aracı betik kullanın.
- Doğrudan erişimi kapatın.
Birinci madde tek başına çoğu saldırıyı etkisiz kılar: yüklenen dosyalar tarayıcıdan doğrudan erişilemeyen bir dizinde tutulursa, içlerinde ne olursa olsun çalıştırılamazlar — çünkü sunucu o adresi hiç sunmaz.
Dosyalar bir aracı betik üzerinden okunup gönderilir.
Bu betik aynı zamanda yetki kontrolü yapma imkânı da verir.
Kök dizin dışına yazma imkânınız yoksa, yükleme klasöründe çalıştırmayı engelleyen bir yapılandırma dosyası şarttır.
Dosya Adı Üretimi
- Kullanıcının verdiği adı kullanmayın.
- Rastgele bir ad üretin.
- Özgün adı veritabanında saklayın.
İkinci madde iki sorunu birden çözer: rastgele üretilen dosya adı hem dizin geçişi denemelerini imkânsız kılar hem de aynı adlı dosyaların birbirinin üzerine yazmasını önler.
Kullanıcının verdiği ad içinde dizin ayracı veya özel karakter olabilir.
Üçüncü madde ise kullanıcı deneyimini korur; indirme sırasında özgün ad gösterilebilir.
Böylece güvenlik ve kullanılabilirlik birlikte sağlanır.
Boyut ve Sayı Sınırı
| Sınır | Amaç |
|---|---|
| Tek dosya boyutu | Disk ve bellek koruması |
| Toplam yükleme sayısı | Kötüye kullanım engeli |
| Kullanıcı başına kota | Adil kullanım |
| Görsel boyutları | İşleme maliyeti |
Dördüncü satır az bilinen bir riski önler: dosya boyutu küçük olsa bile piksel sayısı çok yüksek bir görsel, işlenirken yüzlerce megabayt bellek tüketebilir ve süreci öldürür — sıkıştırılmış bir görsel açıldığında ham hâline döner.
Bu nedenle boyut kontrolü baytla değil, genişlik ve yükseklikle de yapılmalıdır.
İkinci satır ise disk dolmasını önler ve barındırma hesabının askıya alınmasını engeller.
Sınırların hepsi hem tarayıcıda hem sunucuda uygulanmalıdır.
Erişim Yetkisi
- Herkese açık dosyalar ayrılmalı.
- Özel dosyalar yetki kontrolünden geçmeli.
- Tahmin edilebilir adres kullanmayın.
İkinci madde çok sık atlanır: bir kullanıcının yüklediği belge, adresi bilen herkes tarafından açılabiliyorsa aslında hiç korunmuyordur — arama motorları bu adresleri bulup dizine ekleyebilir.
Aracı betik, isteği yapan kullanıcının o dosyaya erişim hakkı olup olmadığını kontrol etmelidir.
Üçüncü madde ek bir katman sağlar ama tek başına güvenlik değildir.
Sıralı numara ile adlandırılan dosyalar kolayca taranabilir.
Yarım Kalan Yüklemeler
- Geçici dizine yazılır.
- Doğrulama başarısızsa silinir.
- Sahipsiz dosyalar düzenli temizlenir.
Üçüncü madde zamanla ciddi bir disk sorununa dönüşür: kullanıcı bir dosya yükleyip formu göndermeden ayrıldığında dosya sunucuda kalır ama hiçbir kayıtla ilişkili değildir — bu sahipsiz dosyalar aylar içinde diskin önemli bir kısmını kaplar.
Düzenli çalışan bir temizlik görevi bu birikimi önler.
Görev, veritabanında karşılığı olmayan ve belirli bir süreden eski dosyaları siler.
Silme işlemi önce raporlanmalı, doğrulandıktan sonra etkinleştirilmelidir.
Zararlı İçerik Taraması
- Görsel yeniden işleme çoğu riski kapatır.
- Belge dosyaları makro içerebilir.
- Arşiv dosyaları açılmamalı.
İkinci ve üçüncü maddeler farklı bir riski işaret eder: sunucunuz için zararsız olan bir dosya, indiren kullanıcı için tehlikeli olabilir — makro içeren bir belge veya zararlı bir arşiv, sitenizi dağıtım aracına dönüştürür.
Kullanıcılar arasında dosya paylaşımı varsa bu risk gerçektir.
Arşiv dosyalarını sunucuda açmak ayrı bir tehlikedir; sıkıştırılmış içerik diski doldurabilir.
Yükleme özelliğinizin gerektirdiği dosya işleme kaynaklarını doğru boyutlandırmak önemlidir; Linux hosting altyapısı ile disk alanınızı ve işleme limitlerinizi ihtiyacınıza göre seçebilirsiniz.
Sonuç
Dosya yükleme güvenliğinin temeli tek cümlede özetlenir: dosya adı ve uzantısı tamamen yükleyen tarafından belirlenir, bu yüzden güvenlik kararı içeriğe dayanmalıdır. Görselleri yeniden işleyin, dosyaları web kök dizini dışında saklayın ve rastgele ad üretin. Sahipsiz dosyaları düzenli temizlemeyi de unutmayın; aksi hâlde disk sessizce dolar.
Sıkça Sorulan Sorular (SSS)
Uzantı kontrolü yeterli değil mi?
Değil. Dosya adı ve uzantısı tamamen yükleyen tarafından belirlenir; bir betik dosyasını resim uzantısıyla adlandırmak saniyeler alır. Tarayıcının bildirdiği içerik türü de değiştirilebilir. Güvenlik kararı dosya içeriğine dayanmalıdır.
Görselleri nasıl güvenli hâle getiririm?
Yükleneni okuyup yeniden kaydedin. Bu işlem içine gizlenmiş her türlü kodu yok eder çünkü çıktı dosyası sizin kütüphaneniz tarafından sıfırdan üretilir. Ayrıca boyut küçültme fırsatı da verir.
Dosyaları nereye kaydetmeliyim?
Web kök dizini dışına. Tarayıcıdan doğrudan erişilemeyen bir dizinde tutulan dosyalar içlerinde ne olursa olsun çalıştırılamaz. Sunum için yetki kontrolü yapan bir aracı betik kullanın. Kök dizin dışına yazamıyorsanız yükleme klasöründe çalıştırmayı engelleyin.
Disk neden sürekli doluyor?
Muhtemelen sahipsiz dosyalar birikiyor. Kullanıcı bir dosya yükleyip formu göndermeden ayrıldığında dosya sunucuda kalır ama hiçbir kayıtla ilişkili değildir. Düzenli çalışan bir temizlik görevi, veritabanında karşılığı olmayan eski dosyaları silmelidir.