💡 Contoh lengkap yang berfungsi tersedia di GitHub:
merge-untrusted-html-uploads-dotnet

Menggabungkan dokumen HTML yang tidak dipercaya dengan aman adalah alur kerja GroupDocs.Merger untuk .NET yang menolak sumber daya eksternal yang dirujuk oleh unggahan — URL remote, jalur UNC, dan file lokal — kecuali Anda secara eksplisit mengizinkannya.

Cara Lama Sangat Menyulitkan

Bayangkan portal penagihan Anda menggabungkan unggahan faktur pelanggan dengan nota pengiriman dari pesanan yang sama menjadi satu dokumen HTML untuk pengarsipan. Faktur tersebut berupa HTML biasa — tautan stylesheet, gambar logo, beberapa paragraf — kecuali Anda tidak menulisnya, melainkan browser atau alat ekspor pelanggan yang melakukannya. Sebelum GroupDocs.Merger 26.10, proses penggabungan memuat sumber daya eksternal yang dirujuk HTML — stylesheet remote, gambar remote, jalur file lokal absolut — dan tidak ada opsi untuk menghentikannya.

Itu menjadi masalah begitu unggahan tidak sepenuhnya dipercaya. URL stylesheet juga dapat menjadi pixel pelacakan. Sebuah src gambar dapat mengarah ke http://169.254.169.254/latest/meta-data/iam/security-credentials/ — alamat metadata cloud — dan langkah penggabungan Anda akan memintanya atas nama pengunggah. Jalur absolut file:/// juga dibaca, sehingga referensi ke unggahan pelanggan lain dapat menarik file tersebut ke output yang digabungkan.

Biaya nyata dari penggabungan secara buta: pekerjaan penggabungan yang mengambil apa pun yang diminta unggahan mengubah server Anda menjadi proxy untuk SSRF, dan referensi file:/// menjadi cara bagi satu penggabungan pelanggan untuk membaca file pelanggan lain.

Ada Cara yang Lebih Baik

GroupDocs.Merger untuk .NET memperbaiki hal ini secara default. Sejak versi 26.10, setiap konstruktor LoadOptions menetapkan SkipExternalResources = true, dan sebuah Merger yang dibuat tanpa opsi pemuatan menggunakan default yang sama — tidak ada yang eksternal yang dimuat kecuali Anda menyatakan sebaliknya.

Prasyarat:

  • .NET (salah satu dari empat kerangka target yang didukung GroupDocs.Merger untuk .NET)
  • GroupDocs.Merger untuk .NET 26.10 atau lebih baru (get a temporary license)
  • Dua dokumen HTML untuk digabungkan, setidaknya satu dari sumber yang tidak sepenuhnya Anda percayai

Instal dengan satu perintah:

dotnet add package GroupDocs.Merger --version 26.10.0

Cara Baru: Menggabungkan HTML Tanpa Mempercayainya

Berikut tampilan menggabungkan dua unggahan HTML dengan pengaturan aman default, sebuah handler yang mencatat setiap keputusan, dan — pada langkah kedua — sebuah handler yang menyediakan satu aset tepercaya.

Langkah 1 - Buat Load Options untuk Format

LoadOptions tidak memiliki konstruktor tanpa parameter dan disegel sejak 26.10; contoh ini menyebutkan format secara eksplisit.

// LoadOptions(FileType.HTML) already denies everything external by default
var audit = new ResourceAudit();
var loadOptions = new LoadOptions(FileType.HTML) { ExternalResourceHandler = audit };

Langkah 2 - Gabungkan Unggahan dan Periksa Keputusan

// 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);
}

Poin Penting:

  • SkipExternalResources: secara implisit true di sini, sehingga setiap URL remote, jalur UNC, dan referensi file lokal ditolak, termasuk file di folder unggahan sendiri.
  • Satu LoadOptions per penggabungan: unggahan kedua tidak mendapatkan opsi sendiri — ia mewarisi apa pun yang digunakan saat membuat Merger tempat ia digabungkan.

Langkah 3 - Izinkan Hanya Satu Sumber Daya Tepercaya

// 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 };

Metode OnLoading pada handler menetapkan args.Skipped = false dan args.Data ke byte tersebut ketika URI yang diminta cocok, sehingga dokumen mendapatkan logo tanpa GroupDocs.Merger melakukan permintaan apa pun.

Ketika kami menjalankan penggabungan default terhadap unggahan faktur dan nota pengiriman, semua tujuh referensi eksternal di kedua file diblokir — stylesheet remote, logo remote, URL gaya metadata, gambar folder saudara, jalur file:///, jalur UNC, dan URL pelacakan dengan string kueri. joined.html mempertahankan teks dari kedua unggahan; placeholder menggantikan setiap gambar yang diblokir. Dengan handler logo tepercaya terpasang, logo kembali supplied dan enam lainnya tetap blocked.

Perbandingan: Sebelum vs. Sesudah

Sebelum (tanpa opsi) Sesudah (GroupDocs.Merger 26.10)
Permintaan eksternal Setiap referensi dimuat secara otomatis Ditolak kecuali secara eksplisit diizinkan
Jalur file lokal absolut Dimuat ke output Ditolak seperti referensi lainnya
Pengecualian tepercaya Tidak diperlukan - semuanya dimuat Satu sumber daya melalui handler, atau prefiks yang masuk whitelist
Entri whitelist buruk Tidak ada whitelist Ditolak dengan ArgumentException saat konstruksi
Kode yang diperlukan Tidak ada cara untuk membatasi pemuatan Beberapa baris pada LoadOptions

Kontrasnya terletak pada apa yang memungkinkan, bukan hanya apa yang nyaman: sebelum 26.10 tidak ada pengaturan yang menghentikan pemuatan; setelahnya, penolakan menjadi default dan setiap pengecualian bersifat eksplisit.

Apakah ini akan merusak HTML yang sudah bergantung pada pemuatan gambar remote?

Jika HTML tersebut masih digabungkan dengan LoadOptions default, ya — gambar tidak akan dimuat, dan placeholder menggantikan posisinya di output. Solusinya eksplisit, bukan solusi sementara: daftarkan sumber tepercaya di WhitelistedResources, atau lampirkan IExternalResourceHandler yang menyediakan aset spesifik yang masih ingin Anda render. Bagaimanapun, proses penggabungan tetap berjalan; hanya saja ia berhenti mengambil apa pun yang tidak Anda sebutkan.

Contoh Dunia Nyata: Konsolidasi Faktur dan Nota Pengiriman

Sebuah pipeline dokumen yang menggabungkan HTML yang dikirim pelanggan ke salinan arsip adalah skenario tepat yang dimodelkan oleh proyek contoh halaman ini: unggahan faktur dan nota pengiriman dari pesanan yang sama, digabung menjadi satu file. Tidak ada unggahan yang ditulis oleh tim pipeline sendiri, sehingga tidak ada yang dapat diasumsikan aman untuk dibaca secara harfiah. Faktur tersebut menyebutkan jumlah yang harus dibayar dan pelanggan, Northwind Traders, serta membawa referensi logo, stylesheet pelacakan, URL gaya metadata cloud, referensi gambar folder yang sama, dan jalur file:/// — tujuh referensi eksternal antara dua unggahan, tidak satupun yang seharusnya diambil oleh pipeline pengarsipan atas nama pelanggan.

Sebelum pekerjaan penggabungan dijalankan, ada baiknya memutuskan, tipe dokumen per tipe dokumen, apakah ada pengecualian yang diperlukan. Skenario penagihan contoh ini membutuhkan tepat satu: logo perusahaan sendiri, yang disajikan dari file yang sudah ada di disk alih-alih diambil dari URL remote yang disebutkan HTML. Semua hal lain — stylesheet pelacakan, alamat gaya metadata, file saudara, jalur UNC, dan file:/// — tidak memiliki alasan sah untuk diambil, sehingga default saja sudah menjadi jawaban yang tepat.

// Reject a whitelist entry that is not an absolute URI prefix
var loadOptions = new LoadOptions(FileType.HTML)
{
    WhitelistedResources = new List<string> { "cdn.example.com" }
};

Memberikan nama host saja alih-alih prefiks absolut seperti https://cdn.example.com/brand/ akan menimbulkan pengecualian, dengan pesan Whitelisted resource 'cdn.example.com' must be an absolute URI without a query, fragment or encoded '/', '\' or '.'. (Parameter 'WhitelistedResources') — sebelum salah satu unggahan bahkan dibuka. Menangkap whitelist yang salah konfigurasi pada saat startup lebih berharga daripada menemuinya setelah sebuah sumber daya diam-diam gagal dimuat di produksi.

Apa Lagi yang Bisa Anda Lakukan dengan GroupDocs.Merger untuk .NET?

  • Validasi entri whitelist lebih awal: entri WhitelistedResources yang tidak valid gagal pada konstruksi Merger, sehingga pemeriksaan startup deployment menangkapnya sebelum dokumen apa pun diproses.
  • Sediakan aset tepercaya dari disk: IExternalResourceHandler dapat menjawab permintaan dengan byte yang sudah Anda miliki, tanpa akses jaringan sama sekali.
  • Terapkan satu kebijakan ke setiap dokumen yang digabungkan: LoadOptions diatur sekali pada Merger, dan setiap dokumen yang kemudian digabungkan mengikutinya.
  • Dukungan lebih dari HTML: pengolahan kata, HTML/MHTML, presentasi, spreadsheet, SVG, dan dokumen EPUB semuanya menghormati opsi yang sama.

Kesimpulan

Menggabungkan HTML yang tidak Anda tulis tidak lagi berarti mempercayai segala isinya. GroupDocs.Merger untuk .NET menolak sumber daya eksternal secara default sejak versi 26.10, dan dua cara untuk memberikan pengecualian — handler aset tepercaya dan WhitelistedResources — memberikan akses tepat sebanyak yang dibutuhkan pipeline, tidak lebih.

Siap mencobanya sendiri?

Sumber Daya Tambahan