
Sitenize bir profil fotoğrafı yükleme alanı eklediniz. Görünüşte zararsız bir özellik — ancak sunucuya dosya yazma yetkisi veren her form, dikkatle ele alınması gereken bir giriş noktasıdır.
Bu yazı, dosya yükleme özelliğinin risklerini ve sunucu tarafında alınacak önlemleri ele alıyor.
Asıl Risk Nedir?
Tehdit, dosyanın kendisinden değil, sunucunun o dosyaya nasıl davrandığından doğar:
- Çalıştırılabilir dosya yüklenmesi: Sunucu onu kod olarak yorumlarsa.
- Yol manipülasyonu: Dosya beklenmedik bir dizine yazılırsa.
- Disk doldurma: Sınırsız yükleme sunucuyu durdurur.
- Zararlı içerik dağıtımı: Siteniz dağıtım noktası olur.
- İşleme sırasında kaynak tüketimi: Özel hazırlanmış dosyalar.
Birinci madde en ciddi olanıdır ve tek bir yapılandırma hatasından doğar: yükleme dizininde kod çalıştırma açıksa, yüklenen bir betik doğrudan sunucuda çalıştırılabilir.
Bu noktadan sonra saldırgan, web sunucusunun yetkileriyle sisteminizde iş yapabilir. Diğer tüm önlemler bu tek riskin yanında ikincil kalır.
Birinci Katman: Kabul Kriterleri
Dosya sunucuya ulaşmadan önce yapılacak kontroller:
- Boyut sınırı koyun. Hem web sunucusunda hem uygulamada.
- Uzantıyı beyaz listeyle sınırlayın. Yasaklı liste değil, izinli liste.
- İçerik türünü doğrulayın. Tarayıcının beyanına güvenmeyin.
- Dosya imzasını okuyun. İlk baytlar gerçek türü söyler.
- Eşzamanlı yükleme sayısını sınırlayın.
İkinci madde yaklaşım farkını gösterir: yasaklı uzantı listesi tutmak kaybedilen bir savaştır — her zaman düşünmediğiniz bir uzantı kalır. Yalnızca kabul ettiklerinizi listeleyin.
Üçüncü ve dördüncü maddeler birlikte çalışır: tarayıcının gönderdiği tür bilgisi kolayca değiştirilebilir, dosyanın ilk baytlarındaki imza ise gerçek biçimi gösterir. Bir dosya kendini görsel olarak tanıtıyor ama imzası uymuyorsa reddedilmelidir.
İkinci Katman: Nereye Yazıldığı
Kabul edilen dosyanın saklanma yeri, güvenliğin en belirleyici kararıdır:
| Yaklaşım | Güvenlik durumu |
|---|---|
| Web kök dizini içinde | Riskli — doğrudan erişilebilir |
| Web kökü dışında | Güvenli — betikle sunulur |
| Ayrı alan adında | Çok güvenli — çerez izolasyonu |
| Nesne depolamada | Sunucudan tamamen ayrık |
İkinci satır çoğu proje için doğru dengeyi kurar: dosyalar web kökünün dışında tutulur ve yalnızca bir betik aracılığıyla sunulur. Bu, doğrudan URL ile erişimi tamamen keser.
Üçüncü satır ek bir avantaj getirir: yüklenen içerik farklı bir alan adından sunulduğunda, o içerik sizin oturum çerezlerinize erişemez.
Üçüncü Katman: Sunucu Yapılandırması
Kendi yapılandırmanıza tam erişiminiz olan bir VDS sunucu paketleri kurulumunda şu önlemleri doğrudan uygulayabilirsiniz:
- Yükleme dizininde kod çalıştırmayı kapatın. En kritik ayar budur.
- Dizin listelemeyi engelleyin.
- Yazma iznini yalnızca gereken dizine verin.
- Yükleme dizinini ayrı bölümde tutun. Disk dolarsa sistem etkilenmesin.
- İçerik türü başlığını sabitleyin. Tarayıcının tahmin etmesini önleyin.
Beşinci madde ince ama önemli bir korumadır: tarayıcılar içerik türünü tahmin etmeye çalışır ve bir dosyayı beklenmedik şekilde yorumlayabilir. Doğru başlıklarla bu davranış kapatılır.
Dördüncü madde ise bir kullanılabilirlik önlemidir. Yükleme dizini ana disk bölümündeyse, sınırsız yükleme sistem günlüklerinin ve veritabanının yazacak yer bulamamasına yol açar.
Dosya Adı Yönetimi
Kullanıcının verdiği dosya adını olduğu gibi kullanmak birçok soruna kapı açar:
- Dizin geçişi denemeleri içerebilir
- Aynı adlı dosyalar birbirini ezebilir
- Türkçe karakter ve boşluklar sorun çıkarabilir
- Çok uzun adlar dosya sistemi sınırlarını zorlar
- Gizli dosya adları kullanılabilir
Çözüm basittir ve hepsini birden halleder: yüklenen dosyaya sunucu tarafında yeni bir ad üretin ve orijinal adı yalnızca veritabanında saklayın.
Kullanıcıya indirme sırasında orijinal adı gösterebilirsiniz — ancak diskte duran ad sizin ürettiğiniz olmalıdır.
Dosya İşleme Riskleri
Yüklenen görselleri boyutlandırıyor veya belgeleri dönüştürüyorsanız ek dikkat gerekir:
- İşleme kütüphaneleri güncel tutulmalıdır. Bilinen açıklar hedeflenir.
- İşleme süresi sınırlanmalıdır. Özel hazırlanmış dosyalar sonsuz döngüye sokabilir.
- Bellek sınırı konmalıdır. Devasa boyut beyanı belleği tüketir.
- İşleme ayrı süreçte yapılmalıdır. Çökme siteyi etkilemesin.
Üçüncü madde bilinen bir saldırı biçimidir: küçük bir dosya, başlığında devasa boyut beyan ederek işleme sırasında tüm belleği tüketebilir. Boyut sınırı yalnızca dosya büyüklüğüne değil, beyan edilen görsel boyutlarına da uygulanmalıdır.
Dördüncü madde ise bir izolasyon önlemidir — ağır işlemleri kuyruk üzerinden arka planda yapmak hem güvenlik hem performans açısından doğru yaklaşımdır.
İzleme ve Temizlik
Kurulum sonrası sürdürülmesi gerekenler:
| İş | Sıklık |
|---|---|
| Yükleme dizini boyut kontrolü | Otomatik uyarı |
| Sahipsiz dosya temizliği | Haftalık |
| Zararlı yazılım taraması | Günlük |
| Beklenmedik uzantı taraması | Günlük |
Dördüncü satır basit ama etkili bir denetimdir: yükleme dizininde izin verdiğiniz uzantılar dışında bir dosya varsa, bir yerde bir kontrol atlanmış demektir.
İkinci satır ise disk yönetimi içindir. Kullanıcı kaydını silen ama dosyalarını silmeyen sistemlerde, yıllar içinde ciddi bir birikim oluşur.
Sonuç
Dosya yüklemede tek kritik risk, yükleme dizininde kod çalıştırmanın açık olmasıdır — diğer tüm önlemler bunun yanında ikincil kalır. Doğrulama tarafında yasaklı uzantı listesi tutmayın, yalnızca kabul ettiklerinizi listeleyin ve dosyanın ilk baytlarındaki imzayı okuyun. Dosyaları web kökünün dışında saklayıp betikle sunmak, doğrudan erişimi tamamen keser. Kullanıcının verdiği adı diskte kullanmayın: sunucu tarafında yeni bir ad üretin, orijinali yalnızca veritabanında saklayın.
Sıkça Sorulan Sorular (SSS)
Uzantı kontrolü yeterli mi?
Değil. Uzantı kolayca değiştirilebilir ve tarayıcının bildirdiği içerik türü de güvenilir değildir. Dosyanın ilk baytlarındaki imzayı okuyup gerçek biçimi doğrulayın — beyan ile imza uyuşmuyorsa reddedin.
Yüklenen dosyaları nerede saklamalıyım?
Web kök dizininin dışında. Böylece doğrudan URL ile erişilemezler ve yalnızca sizin kontrol ettiğiniz bir betik üzerinden sunulurlar. Daha da iyisi, ayrı bir alan adından sunmaktır — o içerik oturum çerezlerinize erişemez.
Boyut sınırını nereye koymalıyım?
İki yere birden: web sunucusu yapılandırmasına ve uygulama koduna. Ayrıca görseller için beyan edilen piksel boyutlarına da sınır koyun — küçük bir dosya devasa boyut beyan ederek işleme sırasında belleği tüketebilir.
Disk dolması riskini nasıl yönetirim?
Yükleme dizinini ayrı bir disk bölümünde tutun ki dolduğunda sistem günlükleri ve veritabanı etkilenmesin. Ayrıca boyut için otomatik uyarı kurun ve kullanıcı kaydı silindiğinde dosyalarının da silindiğinden emin olun.