Dosya yükleme işlevi, kötü amaçlı kod çalıştırmak, kimlik doğrulamayı atlamak veya sunucu kaynaklarını tüketmek isteyen saldırganlar için sık tercih edilen bir hedeftir. Bu rehber, web uygulamalarında sağlam ve güvenli dosya yükleme işlemlerini hayata geçirmek isteyen geliştiriciler, teknik yöneticiler ve güvenlik bilincine sahip işletme sahipleri için hazırlanmıştır. En kritik yükleme kaynaklı güvenlik açıklarını ortadan kaldırmak için her adımı uygulayın.
Sunucu Tarafında Dosya Türü Doğrulaması Yapın
İstemci taraflı doğrulama (JavaScript dosya türü kontrolleri veya HTML accept öznitelikleri) kolayca atlatılabilir. Her yükleme, birden fazla bağımsız sinyal kullanılarak sunucuda doğrulanmalıdır. Yalnızca dosya uzantısına veya tarayıcının sağladığı MIME türüne güvenmek yetersizdir; saldırganlar her ikisini de manipüle edebilir.
- Dosyanın ilk birkaç baytını (sihirli baytlar / dosya imzası) okuyun ve izin verilen formatların beyaz listesiyle karşılaştırın (örneğin PNG
\x89PNGile, PDF%PDFile başlar). - Sunucu tarafında tespit edilen MIME türünü, istemci tarafından gönderilen Content-Type başlığından bağımsız olarak doğrulayın.
- İzin verilen uzantıların katı bir beyaz listesini tutun (örn.
.jpg,.png,.pdf) — bilinen kötü uzantıları engellemeye çalışmak yerine listede olmayanları reddedin. evil.php.jpggibi çift uzantılı dosyaları, her uzantı bileşenini soyarak ve doğrulayarak reddedin.- Görsel yüklemeleri için, gömülü yükleri temizlemek ve geçerli bir görsel olduğunu doğrulamak amacıyla görseli sunucu tarafında yeniden kodlayın (örn. ImageMagick veya Pillow kullanarak).
Dosya Boyutu ve Adet Sınırları Uygulayın
Sınırsız yükleme boyutları, saldırganların disk alanını veya belleği tüketerek hizmet engelleme durumlarına yol açmasına imkân tanır. Birden fazla katmanda sınır belirlemek, isteklerin önemli kaynaklar tüketmeden reddedilmesini sağlar.
- Kullanım durumunuza uygun bir maksimum dosya boyutu belirleyin (örn. profil fotoğrafları için 5 MB, belgeler için 50 MB) ve bunu hem web sunucusu yapılandırmanızda hem de uygulama kodunuzda zorunlu kılın.
- Aşırı büyük istekleri uygulamanıza ulaşmadan sunucu düzeyinde reddetmek için
client_max_body_size(Nginx) veyaLimitRequestBody(Apache) ayarlarını yapılandırın. - Tek bir istekte yüklenebilecek dosya sayısını ve kullanıcı başına zaman pencerindeki yükleme sayısını sınırlayın (hız sınırlama).
- Sınırlar aşıldığında net bir hata mesajı döndürün — dosyaları sessizce kesmekten kaçının; bu durum bozuk verinin depolanmasına yol açabilir.
Yüklenen Dosyaları Temizleyin ve Yeniden Adlandırın
Kullanıcı tarafından kontrol edilen dosya adlarına izin vermek, yol geçişi, üzerine yazma saldırıları ve çalıştırılabilir adlandırma hileleri gibi risklere kapı aralar. Orijinal dosya adını her zaman tamamen sizin kontrolünüzde olan bir adla değiştirin.
- Her yüklenen dosya için kriptografik olarak rastgele bir dosya adı oluşturun (örn. bir UUID veya güvenli rastgele hex dizesi) — diskte asla orijinal dosya adını kullanmayın.
- Orijinal dosya adındaki uzantıyı değil, sunucu tarafı tür kontrolünüzle belirlenen ve beyaz listede yer alan uzantıyı ekleyin.
- Orijinal dosya adını görüntüleme amacıyla saklamanız gerekiyorsa, bunu diskteki gerçek dosya adı olarak değil, yalnızca veritabanınızda tutun.
- Dosyayla birlikte saklanacak meta verileri temizleyin (örn. GPS koordinatları veya cihaz bilgilerinin sızmasını önlemek için görsellerden EXIF verilerini silin).
Dosyaları Web Kökü Dışında Depolayın
Yüklenen dosyalar herkese açık bir dizinde depolanıyorsa, bir web kabuğu yükleyen saldırgan URL üzerinden doğrudan erişebilir ve rastgele komutlar çalıştırabilir. Depolama alanını web kökü dışına taşımak en etkili azaltma yöntemlerinden biridir.
- Yüklenen dosyaları web sunucunuzun doğrudan servis etmediği bir dizinde saklayın (örn.
/var/www/html/uploads/yerine/var/uploads/). - Yüklenen dosyaları, dosyayı özel dizinden okuyan ve uygun başlıklarla istemciye akıtan uygulama tarafından kontrol edilen bir uç nokta üzerinden sunun.
- Zaman sınırlı, kimliği doğrulanmış erişim için özel demet politikaları ve önceden imzalanmış URL'lerle nesne depolama (örn. AWS S3, Google Cloud Storage) kullanmayı değerlendirin.
- Web sunucunuz tarafından hâlihazırda statik içerik olarak sunulan dizinlere asla yazma erişimi vermeyin.
Yükleme Dizinlerinde Betik Çalıştırmayı Engelleyin
Dosyalar web erişimine açık bir dizinde saklanıyor olsa bile, web sunucusunun bu dizindeki dosyaları uzantılarından bağımsız olarak asla betik olarak çalıştırmamasını sağlayarak riski önemli ölçüde azaltabilirsiniz.
- Nginx: Yükleme dizininiz için
default_type application/octet-streamayarlayan vefastcgi_passya dauwsgi_passyönergelerini kaldıran birlocationbloğu ekleyin. - Apache: Yükleme dizinine,
Options -ExecCGI,AddHandler default-handler .php .py .pl .rbvephp_flag engine offiçeren bir.htaccessdosyası ekleyin. - Web sunucusu yapılandırmanızın rastgele dosya türlerini betik olarak çalıştıran kapsamlı bir işleyicisinin olmadığından emin olun.
- Yüklenen içeriklerin bulunduğu dizinler için sunucu taraflı içerme (SSI) özelliğini devre dışı bırakın.
Yüklenen Dosyaları Kötü Amaçlı Yazılım İçin Tarayın
Tür doğrulamasını geçen dosyalar bile aşağı yönlü kullanıcıları hedef alan gömülü kötü amaçlı yükler içerebilir (örn. makro içeren Office belgeleri, çok biçimli dosyalar). Kötü amaçlı yazılım taramasının entegre edilmesi kritik bir ikinci savunma hattı ekler.
- Yükleme hattınıza sunucu taraflı bir antivirüs çözümü (örn. ClamAV) entegre edin — dosyaları kalıcı depolamaya alınmadan önce tarayın.
- Yüksek riskli ortamlar için, sıfır gün tehditlerini tespit etmek amacıyla dosyaları yalıtılmış bir ortamda çalıştıran kum havuzlu analiz hizmetleri kullanın.
- Kötü amaçlı yazılım taramasında başarısız olan dosyaları karantinaya alın ve güvenlik ekibinizi derhal uyarın — sessizce atmadan araştırın.
- Yeni tehditlerin hızla yakalanması için virüs tanımlarını ve tarama motorlarını otomatik olarak güncel tutun.
- Tanımlar geliştikçe arşivinizdeki daha önce tespit edilememiş tehditleri yakalamak için depolanan dosyaları periyodik olarak yeniden tarayın.
Dosyaları Son Kullanıcılara Güvenli Biçimde Sunun
Dosyaların kullanıcılara nasıl iletildiği, nasıl depolandığı kadar önemlidir. Hatalı başlıklar veya aynı kaynak üzerinden sunum, tarayıcının bir dosyanın türünü yanlış yorumlayıp çalıştırdığı Siteler Arası Betik Çalıştırma (XSS) veya İçerik Koklama saldırılarına yol açabilir.
- Uygun durumlarda tarayıcıda işleme yerine indirme diyaloğunu zorunlu kılmak için tüm kullanıcı tarafından yüklenen dosyalara
Content-Disposition: attachment; filename="guvenliisim.uzanti"başlığını ekleyin. - İstemci tarafından sağlanan Content-Type'ı yansıtmak yerine, sunucu tarafı doğrulamanıza dayalı açık ve doğru bir
Content-Typebaşlığı ayarlayın. - Tarayıcıların içerik türünü MIME koklama yöntemiyle belirlemesini önlemek için yüklenen dosyaları sunan tüm yanıtlara
X-Content-Type-Options: nosniffekleyin. - Kötü amaçlı içeriklerin ana uygulama kaynağınızdaki çerezlere veya depolama alanına erişememesi için kullanıcı tarafından yüklenen içerikleri ayrı, kum havuzlu bir etki alanı veya alt etki alanından (örn.
uploads.etkialaniniz.comveya bir CDN etki alanı) sunun. - Yüklenen içerikleri görüntüleyen veya bunlara bağlantı veren sayfalara kısıtlayıcı bir
Content-Security-Policybaşlığı uygulayın.
Katı Erişim Kontrolleri Uygulayın
Uygulamanız bunu açıkça gerektirmediği sürece yükleme işlevi halka açık olmamalıdır. Yüklemelerin herkese açık olduğu durumlarda bile ortaya çıkan dosyalara erişim, yetkisiz veri erişimini veya kötüye kullanımı önlemek için uygun şekilde kısıtlanmalıdır.
- Tüm yükleme uç noktaları için kimlik doğrulama zorunlu kılın — kimliği doğrulanmamış yükleme uç noktaları kötüye kullanım ve spam için yaygın bir hedeftir.
- Bir kullanıcının yalnızca görüntüleme iznine sahip olduğu dosyalara erişebildiğinden emin olmak için yetkilendirme kontrolleri uygulayın — gerçek depolama yolunu açığa çıkarmak yerine dolaylı referanslar (örn. veritabanında eşlenen bir UUID) kullanın.
- Hangi kullanıcı rollerinin dosya yükleyebileceğini ve her rolün hangi dosya türlerini yüklemesine izin verileceğini kısıtlamak için rol tabanlı erişim denetimi (RBAC) uygulayın.
- Paylaşılan dosya bağlantılarının maruz kalma penceresini sınırlamak için erişim belirteçlerini veya önceden imzalanmış URL'leri derhal geçersiz kılın veya süresi doldurun.
- Ham depolama konumuna (bulut demeti, dosya sunucusu) kimin erişebildiğini denetleyin ve en az ayrıcalık ilkesini uygulayın — uygulama hizmet hesaplarının yalnızca ihtiyaç duydukları erişime sahip olması gerekir.
Yükleme Etkinliğini Günlüğe Kaydedin, İzleyin ve Uyarı Alın
Yükleme olaylarını kaydetmek, olay müdahalesi için denetim izi oluşturur ve anomali tespitini mümkün kılar. Yükleme davranışına ilişkin görünürlük olmadan, saldırılar önemli hasara yol açana kadar fark edilmeyebilir. Sensagraph, yükleme kaynaklı saldırılara işaret edebilecek anormal veya şüpheli davranışlar için web uygulama uç noktalarınızı sürekli olarak izler.
- Her yükleme girişimini kaydedin — kimliği doğrulanmış kullanıcı, zaman damgası, orijinal dosya adı, tespit edilen MIME türü, dosya boyutu ve sonuç (kabul edildi/reddedildi) dahil.
- Aynı IP adresinden veya kullanıcı hesabından gelen tekrarlanan yükleme başarısızlıklarında uyarı verin; bu durum araştırma veya fuzzing girişimlerine işaret edebilir.
- Özellikle çalıştırılabilir biçimlere yakın olanlar başta olmak üzere alışılmadık dosya türlerinin yüklenmesi için uyarılar ayarlayın.
- Depolama dizinlerini, dosya bütünlüğü izleme (FIM) araçları kullanarak çalıştırılabilir uzantılara sahip olanlar başta olmak üzere beklenmedik yeni dosyalar için izleyin.
- Toplu yüklemeler veya mesai saatleri dışı etkinlikler gibi kalıpları aramak için yükleme günlüklerini rutin güvenlik operasyonlarınızın bir parçası olarak düzenli aralıklarla gözden geçirin.
- Yükleme olay günlüklerini, diğer güvenlik olaylarıyla ilişkilendirilebilmeleri için SIEM'inize veya merkezi günlükleme platformunuza entegre edin.
Yükleme Güvenliğinizi Düzenli Olarak Test Edin
Güvenlik kontrolleri, kod değiştikçe, bağımlılıklar güncellendikçe ve yapılandırmalar kaydıkça zamanla bozulur. Düzenli ve yapılandırılmış testler, yükleme kontrollerinizin gelişen saldırı tekniklerine karşı etkili kalmasını sağlar.
- CI/CD hattınıza yükleme güvenliği testleri ekleyin — eksik başlıklar, eksik tür doğrulaması ve korumasız uç noktalar için kontrolleri otomatikleştirin.
- Yükleme işlevinin manuel sızma testini en az yılda bir veya herhangi bir önemli özellik değişikliğinin ardından yapın; çift uzantılar, null baytlar ve çok biçimli dosyalar gibi yaygın atlama tekniklerini deneyin.
- Yanlış yapılandırılmış yükleme uç noktaları ve dosya sunma yanıtlarındaki eksik güvenlik başlıkları için uygulamanızı sürekli taramak amacıyla Sensagraph'ı kullanın.
- Yeni desteklenen formatları veya kaldırılması gereken eski formatları hesaba katmak için dosya türü beyaz listenizi periyodik olarak gözden geçirin ve güncelleyin.
- Yeni güvenlik açıklarının tanıtılmadığından emin olmak için değişiklikleri birleştirmeden önce yükleme işleme koduna özel olarak odaklanan kod incelemeleri yapın.