Kullanıcı dosya yükleyebiliyorsa, saldırı yüzeyin bir dosya kadar geniş

Pasaport, diploma, banka dökümü. Sperare'de yükleme akışı ürünün merkezinde — ve bir yükleme kutusu, kabul ettiğin her baytın sorumluluğunu da alıyor.

This post is in Turkish.

Sperare'de kullanıcılar pasaport yüklüyor, Xaron'da topluluklar ekran görüntüsü paylaşıyor. Her iki üründe de yükleme akışı vazgeçilmez.

Ve bir yükleme kutusu, dışarıdan gelen ikili veriyi kabul edip saklamayı, sonra da başka kullanıcılara sunmayı taahhüt ediyor. Bu üç aşamanın her biri ayrı bir problem.

Uzantı bir bilgi değil

İlk hata dosya tipine uzantıdan karar vermek. Kullanıcı istediği uzantıyı yazabiliyor.

İkinci hata, istemcinin bildirdiği içerik tipine güvenmek — o da istemciden geliyor.

Doğru yol içeriğin kendisine bakmak: dosyanın ilk baytları gerçekten iddia edilen biçimin imzasını taşıyor mu. Ve bu kontrol izin listesi mantığıyla çalışmalı — hangi biçimlere izin verildiğini sayıyorsun, hangilerinin yasak olduğunu değil. Yasak listesi hiçbir zaman tamamlanmıyor.

Panelin tasarımında bunu bilinçli olarak görünür yaptık: desteklenmeyen biçim, yükleme kartında kırmızı bir durum. Kullanıcı ne olduğunu anlıyor, sessizce başarısız olmuyor.

Boyut sınırı bir güvenlik ayarı

İkincisi, sınırın nerede uygulandığı.

Uygulamada kontrol ediyorsan, dosya zaten sunucuya gelmiş oluyor. Yüz megabaytlık bir dosyayı reddetmek için önce yüz megabayt kabul etmek, tam olarak kaçınmak istediğin şey.

Sınır kenarda uygulanmalı — bağlantı, sınır aşıldığı anda kesilmeli. Ve sınır sadece bayt değil: aynı anda kaç yükleme, dakikada kaç istek, kullanıcı başına toplam alan.

Bir de sıkıştırılmış dosyaların tuzağı var. Küçük bir arşiv, açıldığında diski doldurabiliyor. Açma işlemi yapıyorsan, açılmış boyut için de bir tavan gerekiyor.

Kabul ettiğin her bayt, saklamayı ve sunmayı taahhüt ettiğin bir bayttır.

Sunmak, saklamaktan tehlikeli

Üçüncü ve en çok atlanan aşama: dosyayı geri verirken ne oluyor.

Kullanıcının yüklediği bir dosya, senin alan adın üzerinden sunulduğunda tarayıcı ona senin sitenin haklarını veriyor. İçinde çalıştırılabilir bir şey varsa, senin sayfanda çalışıyor.

Bunun standart çözümü kullanıcı içeriğini ayrı bir alan adından sunmak, tarayıcıya içeriği yorumlamamasını söylemek ve indirme olarak işaretlemek. Ayrıca dosya adını hiç güvenmemek — yol karakterleri içeren bir ad, dosyayı olmaması gereken bir yere yazabiliyor.

Erişim: bağlantıyı bilen değil, hakkı olan

Dördüncüsü, dosyaların kim tarafından görülebildiği.

"Tahmin edilemez URL" bir erişim kontrolü değil. Bağlantı paylaşılıyor, tarayıcı geçmişinde kalıyor, bir destek biletine yapıştırılıyor.

Doğru kurgu, her indirme isteğinin yetki kontrolünden geçmesi ve kısa ömürlü, tek kullanıcıya bağlı bir bağlantı üretilmesi. RLS yazısında değindiğim ayrımın somut hâli bu: tabloların politikası mükemmel olabilir, kova politikası ondan bağımsız.

Karantina bir akış, kontrol değil

Son olarak tarama.

Yüklenen dosyayı taramak gerekiyor ama tarama anlık değil. Doğru yapı, dosyayı önce karantinada tutmak, taramayı kuyrukta yapmak, ve temiz çıkana kadar erişime açmamak.

Bu, kullanıcı deneyimine bir gecikme ekliyor — ve o gecikmeyi gizlemek yerine göstermek gerekiyor: "belgeniz kontrol ediliyor". Sperare'de bu gecikme kabul edilebilir, çünkü karşı taraf bir göçmenlik dosyası açıyor, anlık paylaşım yapmıyor.

Ürüne göre bu denge değişiyor. Ama tarama yapmamayı seçiyorsan, bunu bilmeden değil bilerek seçmelisin.