Dosya yükleme formlarında güvenlik, dosya türü doğrulama, kullanıcı kotası, sunucu limiti ve disk izleme adımlarıyla birlikte planlanmalıdır.
Dosya yükleme formları, kullanıcı deneyimini kolaylaştırırken uygulamanın en riskli temas noktalarından birini oluşturur. Profil fotoğrafı, belge, teklif dosyası veya destek eki gibi masum görünen yüklemeler; zararlı betik, aşırı büyük dosya, sahte uzantı ya da disk tüketimi saldırısına dönüşebilir. Bu nedenle güvenlik ve disk sınırı, form tasarımından sunucu yapılandırmasına kadar birlikte ele alınmalıdır.
Yükleme alanı yalnızca “dosya seç” düğmesinden ibaret değildir. Kullanıcıdan gelen her dosya, sistem açısından doğrulanmamış bir girdidir. En sık görülen riskler arasında çalıştırılabilir dosya yükleme, MIME tipi kandırma, dosya adı üzerinden dizin atlama, çok büyük dosyalarla servis kesintisi oluşturma ve depolama alanını doldurma yer alır.
Özellikle paylaşımlı hosting ortamlarında kaynaklar sınırlı olduğu için tek bir hatalı form, aynı hesap altındaki e-posta, veritabanı ve web sitesi performansını da etkileyebilir. Bu nedenle kontrol yalnızca HTML formunda değil, uygulama ve sunucu katmanında da yapılmalıdır.
Yalnızca dosya uzantısına güvenmek doğru değildir. Bir saldırgan, zararlı bir PHP dosyasını görsel uzantısıyla yeniden adlandırabilir. Kabul edilecek dosya türleri açıkça belirlenmeli; örneğin sadece JPG, PNG ve PDF gerekiyorsa liste bununla sınırlandırılmalıdır. Uygulama tarafında hem uzantı hem de gerçek MIME tipi kontrol edilmelidir.
Kullanıcının yüklediği orijinal dosya adı doğrudan saklanmamalıdır. Türkçe karakter, boşluk, komut benzeri ifadeler veya aynı isimli dosyalar sorun çıkarabilir. Güvenli yaklaşım, dosya adını sistem tarafından benzersiz bir değerle yeniden üretmek ve gerekiyorsa orijinal adı yalnızca veritabanında metin olarak tutmaktır.
Yüklenen dosyaların bulunduğu dizinde PHP, CGI veya benzeri betiklerin çalışması engellenmelidir. Mümkünse dosyalar web kök dizini dışında saklanmalı, erişim uygulama üzerinden kontrollü biçimde verilmelidir. Bu mümkün değilse ilgili klasörde betik çalıştırmayı kapatan sunucu kuralları uygulanmalıdır.
Disk sınırı belirlerken yalnızca tek dosya boyutu düşünülmemelidir. Toplam kullanıcı kotası, günlük yükleme sayısı, dosya saklama süresi ve yedekleme maliyeti birlikte hesaplanmalıdır. Örneğin 10 MB tekil dosya limiti düşük görünebilir; ancak 5.000 kullanıcının her biri 20 dosya yüklediğinde depolama ihtiyacı hızla artar.
Pratik bir hesaplama için şu formül kullanılabilir: ortalama dosya boyutu x kullanıcı başına beklenen dosya sayısı x aktif kullanıcı sayısı. Bu değere geçici dosyalar, önizleme görselleri, loglar ve yedekler için ek pay ayrılmalıdır. Kurumsal projelerde en az yüzde 25-40 arası güvenlik payı planlamak daha sağlıklı olur.
Limit, iş ihtiyacına göre belirlenmelidir. Profil görseli için 2 MB çoğu zaman yeterliyken, sözleşme PDF dosyaları için 10-20 MB gerekebilir. Video, yüksek çözünürlüklü tasarım dosyası veya arşiv yükleniyorsa farklı depolama mimarisi düşünülmelidir. Gereğinden yüksek limit, kullanıcıya kolaylık sağlasa da sunucu kaynaklarını gereksiz tüketebilir.
PHP tabanlı projelerde upload_max_filesize, post_max_size, max_file_uploads ve max_execution_time değerleri birbiriyle uyumlu olmalıdır. post_max_size değeri, upload_max_filesize değerinden küçükse form beklenmedik şekilde başarısız olabilir. Nginx kullanılan sistemlerde client_max_body_size ayarı ayrıca kontrol edilmelidir.
WordPress projelerinde eklenti üzerinden limit artırmak her zaman yeterli değildir. Panel, PHP yapılandırması ve web sunucusu limiti çakışıyorsa en düşük değer geçerli olur. Bu noktada hosting paketinin izin verdiği kaynaklar ve sağlayıcının uyguladığı üst sınırlar mutlaka doğrulanmalıdır.
Güvenlik kontrolleri kadar kullanıcı iletişimi de önemlidir. “Hata oluştu” yerine “PDF dosyası en fazla 10 MB olabilir” gibi açık mesajlar verilmelidir. Ancak hata mesajları sunucu yolu, sistem sürümü veya teknik detay içermemelidir. Böylece kullanıcı neyi düzeltmesi gerektiğini anlar, saldırgan ise fazladan bilgi edinemez.
Dosya yükleme güvenliği tek seferlik bir ayar değildir. Disk kullanımı düzenli izlenmeli, kullanılmayan dosyalar için saklama politikası tanımlanmalı ve yedeklerin toplam kota üzerindeki etkisi takip edilmelidir. Trafik arttıkça mevcut limitler yeniden değerlendirilerek sunucu kapasitesi, kullanıcı ihtiyacı ve güvenlik dengesi korunmalıdır.