💡 Tam çalışan örnek GitHub’da mevcuttur: merge-untrusted-html-uploads-dotnet
Güvenilmeyen HTML belgelerini güvenli bir şekilde birleştirmek, .NET için bir GroupDocs.Merger iş akışıdır ve bir yüklemenin başvurduğu dış kaynakları – uzak URL’ler, UNC yolları ve yerel dosyalar – siz açıkça izin verene kadar reddeder.
Eski Yöntem Zor ve Sıkıntılıydı
Hayal edin, faturalama portalınız bir müşterinin fatura yüklemesini aynı siparişten bir teslimat notu ile arşivleme amacıyla tek bir HTML belgesinde birleştiriyor. Fatura sade bir HTML – bir stil sayfası bağlantısı, bir logo resmi, birkaç paragraf – ama siz bunu yazmadınız, müşterinin tarayıcısı ya da dışa aktarma aracı yazdı. GroupDocs.Merger 26.10’dan önce, birleştirme HTML’in başvurduğu dış kaynakları – uzak stil sayfaları, uzak resimler, mutlak yerel dosya yolları – yüklerdi ve bunu durduracak bir seçenek yoktu.
Yükleme tam olarak güvenilir olmadığında bu bir sorun haline gelir. Bir stil sayfası URL’si aynı zamanda bir izleme pikseli olabilir. Bir resim src değeri http://169.254.169.254/latest/meta-data/iam/security-credentials/ gibi bir bulut meta verisi adresine işaret edebilir ve birleştirme adımınız bu isteği yükleyenin adına yapar. Mutlak bir file:/// yolu da okunurdu, böylece başka bir müşterinin yüklemesine yapılan bir referans o dosyayı birleştirilmiş çıktıya çekebilirdi.
Kör bir şekilde birleştirmenin gerçek maliyeti: bir yüklemenin istediği her şeyi getiren bir birleştirme işi, sunucunuzu SSRF için bir proxy haline getirir ve bir
file:///referansı, bir müşterinin birleştirmesinin başka bir müşterinin dosyasını okumasına yol açar.
Daha İyi Bir Yol Var
GroupDocs.Merger for .NET bunu varsayılan olarak düzeltir. 26.10 sürümünden itibaren, her LoadOptions yapıcısı SkipExternalResources = true ayarını yapar ve yükleme seçenekleri olmadan oluşturulan bir Merger aynı varsayılanı kullanır – aksi belirtilmedikçe dış kaynaklar yüklenmez.
Önkoşullar:
- .NET (GroupDocs.Merger for .NET’in desteklediği dört hedef çerçeveden herhangi biri)
- GroupDocs.Merger for .NET 26.10 veya üzeri (geçici bir lisans alın)
- Birleştirilecek iki HTML belgesi, en az biri tamamen güvenmediğiniz bir kaynaktan
Tek bir komutla kurun:
dotnet add package GroupDocs.Merger --version 26.10.0
Yeni Yöntem: HTML’i Güvenmeden Birleştirmek
İki HTML yüklemesini güvenli varsayılanlarla, her kararı kaydeden bir işleyiciyle ve ikinci aşamada bir güvenilir varlık sağlayan bir işleyiciyle nasıl birleştireceğinize bir göz atın.
Adım 1 - Format İçin Load Options Oluşturun
LoadOptions parametresiz bir yapıcıya sahip değildir ve 26.10’dan beri sealed’dir; örnek formatı açıkça adlandırır.
// LoadOptions(FileType.HTML) already denies everything external by default
var audit = new ResourceAudit();
var loadOptions = new LoadOptions(FileType.HTML) { ExternalResourceHandler = audit };
Adım 2 - Yüklemeleri Birleştir ve Kararları İncele
// Both uploads follow the options of the Merger they are joined to
using (var merger = new Merger(firstUpload, loadOptions))
{
merger.Join(secondUpload);
merger.Save(outputPath);
}
foreach (string decision in audit.Decisions)
{
Console.WriteLine(decision);
}
Temel noktalar:
SkipExternalResources: burada dolaylı olaraktrueolduğu için, her uzak URL, UNC yolu ve yerel dosya referansı reddedilir, yüklemenin kendi klasöründeki bir dosya dahil.- Bir
LoadOptionsher birleştirme için: ikinci yükleme kendi seçeneklerine sahip olmaz – birleştirildiğiMerger‘ın oluşturulurken kullanılan ayarları devralır.
Adım 3 - Tam Olarak Bir Güvenilir Kaynağa İzin Ver
// Supply the logo's bytes directly instead of requesting it over the network
var trustedAssets = new Dictionary<string, byte[]>
{
[logoUrl] = File.ReadAllBytes(logoPath)
};
var audit = new ResourceAudit(trustedAssets);
var loadOptions = new LoadOptions(FileType.HTML) { ExternalResourceHandler = audit };
İşleyicinin OnLoading metodu, istenen URI eşleştiğinde args.Skipped = false ve args.Data‘yı bu baytlara ayarlar, böylece belge logo’yu GroupDocs.Merger’ın herhangi bir istekte bulunmadan alır.
Varsayılan birleştirme işlemini fatura ve teslimat notu yüklemeleri üzerinde çalıştırdığımızda, her iki dosyada bulunan yedi dış referans da engellendi – uzak stil sayfası, uzak logo, meta veri tarzı URL, kardeş klasör resmi, bir file:/// yolu, bir UNC yolu ve sorgu dizesi içeren bir izleme URL’si. joined.html her iki yüklemenin metnini tutar; her engellenen resim için bir yer tutucu bulunur. Güvenilir logo işleyicisi eklendiğinde logo supplied (sağlandı) ve diğer altı blocked (engellendi) olarak kalır.
Yan Yana: Önce ve Sonra
| Önce (seçenek yok) | Sonra (GroupDocs.Merger 26.10) | |
|---|---|---|
| Harici istekler | Her referans otomatik olarak yüklendi | Açıkça izin verilmedikçe reddedildi |
| Mutlak yerel dosya yolları | Çıktıya yüklendi | Diğer referanslar gibi reddedildi |
| Güvenilir istisnalar | Gerek yok - her şey yüklendi | Bir kaynak bir işleyici aracılığıyla, ya da beyaz listeli bir önek |
| Kötü beyaz liste girişi | Beyaz liste yoktu | ArgumentException ile oluşturulurken reddedildi |
| Gerekli kod | Yüklemeyi kısıtlamanın bir yolu yoktu | LoadOptions üzerinde birkaç satır |
Fark, sadece neyin mümkün olduğunda değil, aynı zamanda neyin pratik olduğunda da ortaya çıkar: 26.10’dan önce yüklemeyi durduracak bir ayar yoktu; sonrasında reddetmek varsayılan, her istisna ise açıkça belirtilir.
Bu, uzaktan resim yüklemeye bağlı HTML’i bozacak mı?
Bu HTML hâlâ varsayılan LoadOptions ile birleştiriliyorsa, evet – resimler yüklenmez ve bir yer tutucu çıktıda onların yerine konur. Çözüm açık ve geçici bir çözüm değildir: güvenilir kaynakları WhitelistedResources içinde listeleyin ya da hâlâ render etmek istediğiniz belirli varlıkları sağlayan bir IExternalResourceHandler ekleyin. Her iki durumda da birleştirme çalışmaya devam eder; sadece adlandırmadığınız hiçbir şeyi getirmez.
Gerçek Dünya Örneği: Fatura ve Teslimat Notu Konsolidasyonu
Müşteri tarafından gönderilen HTML’i bir arşiv kopyasına birleştiren bir belge hattı, bu sayfanın örnek projesinin modellediği senaryodur: aynı siparişten bir fatura yüklemesi ve bir teslimat notu, tek bir dosyada birleştirilir. Hiçbir yükleme, hattın kendi ekibi tarafından yazılmadığı için, kelimenin tam anlamıyla güvenli olduğu varsayılamaz. Fatura, bir tutar, bir müşteri (Northwind Traders) ve bir logo referansı, izleme stil sayfası, bulut meta veri tarzı URL, aynı klasör resmi ve bir file:/// yolu içerir – iki yükleme arasında yedi dış referans, arşivleme hattının müşterinin adına bu referansları çekmesi gerekmez.
Birleştirme işi canlıya alınmadan önce, belge türüne göre herhangi bir istisna gerekip gerekmediğine karar vermek faydalıdır. Bu örnek senaryoda sadece bir istisna gerekiyordu: şirketin kendi logosu, HTML’in belirttiği uzak URL’den çekilmek yerine zaten disk üzerinde bulunan bir dosyadan sağlandı. Diğer her şey – izleme stil sayfası, meta veri tarzı adres, kardeş dosya, UNC ve file:/// yollar – çekilmesi için meşru bir neden taşımıyordu, bu yüzden varsayılan ayarlar onlar için doğru yanıttı.
// Reject a whitelist entry that is not an absolute URI prefix
var loadOptions = new LoadOptions(FileType.HTML)
{
WhitelistedResources = new List<string> { "cdn.example.com" }
};
Mutlak bir önek (https://cdn.example.com/brand/) yerine çıplak bir host adı vermek, Whitelisted resource 'cdn.example.com' must be an absolute URI without a query, fragment or encoded '/', '\' or '.' mesajı ile ArgumentException fırlatır – her iki yükleme bile açılmadan önce. Başlangıçta hatalı bir beyaz listeyi yakalamak, üretimde sessizce bir kaynağın yüklenememesini yakalamaktan çok daha değerlidir.
GroupDocs.Merger for .NET ile Başka Ne Yapabilirsiniz?
- Beyaz liste girdilerini erken doğrulayın: hatalı bir
WhitelistedResourcesgirdisiMergeroluşturulurken başarısız olur, böylece dağıtımın başlangıç kontrolleri herhangi bir belge işlenmeden önce hatayı yakalar. - Güvenilir varlıkları diskten sağlayın:
IExternalResourceHandler, zaten sahip olduğunuz baytlarla bir isteğe yanıt verebilir, hiç ağ erişimi gerektirmez. - Her birleştirilen belgeye tek bir politika uygulayın:
LoadOptionsMergerüzerinde bir kez ayarlanır ve sonradan ona eklenen her belge aynı kuralları izler. - HTML’den fazlasını kapsayın: kelime işlem, HTML/MHTML, sunumlar, elektronik tablolar, SVG ve EPUB belgeleri aynı seçenekleri saygı gösterir.
Sonuç
Yazmadığınız HTML’i birleştirmek artık içindeki her şeye güvenmek anlamına gelmez. GroupDocs.Merger for .NET, 26.10 sürümünden itibaren dış kaynakları varsayılan olarak reddeder ve bir istisna vermenin iki yolu – güvenilir varlık işleyicisi ve WhitelistedResources – bir hattın ihtiyaç duyduğu erişimi tam olarak sağlar, fazlasını değil.
Kendiniz denemeye hazır mısınız?
- Ücretsiz geçici lisansı deneyin
- Harici kaynakların yüklenmesini nasıl atlayacağınızı okuyun
- GroupDocs.Merger’ın ne zaman ağa eriştiğini öğrenin
- Adım adım kullanım senaryosu rehberine göz atın
- GitHub’daki örnek projeye göz atın