flawopen.com/XSS/Rendering Markdown
Apakah rendering Markdown aman dari XSS?
Perlakukan HTML hasil Markdown sebagai konten yang tidak tepercaya. Parser dapat mempertahankan HTML mentah karena sintaks mengizinkannya; mengubah Markdown tidak membersihkan hasilnya. Parser adalah penerjemah markup, bukan penjaga keamanan.
Letak batas kepercayaan
Spesifikasi CommonMark menyatakan bahwa HTML mentah berbentuk tag dirender tanpa escaping. Perilaku sebenarnya bergantung pada parser, opsi, plugin, dan framework. Misalnya, Marked secara eksplisit memperingatkan bahwa ia tidak membersihkan HTML yang dihasilkan. Sintaks Markdown tidak membuktikan input aman; sanitizer harus melindungi tujuan penyisipan HTML terakhir.
Alur rendering yang aman
const html = marked.parse(userMarkdown); container.innerHTML = html; // output parser belum dibersihkan
import DOMPurify from "dompurify";
const html = marked.parse(userMarkdown);
container.innerHTML = DOMPurify.sanitize(html, {
USE_PROFILES: { html: true }
});
Contoh ini memakai profil HTML saja dari DOMPurify karena tampilan ini tidak memerlukan SVG atau MathML. Batasi fitur pada kebutuhan produk. Jangan mengubah markup yang sudah dibersihkan atau meneruskannya ke pustaka lain yang mengubah HTML sebelum disisipkan; langkah tersebut dapat membatalkan jaminannya. Jika HTML kaya tidak diperlukan, gunakan rendering teks aman dari framework. Content Security Policy dan Trusted Types adalah pertahanan tambahan, bukan pengganti sanitasi.
Pemeriksaan sebelum produksi
- ✓Tetapkan versi parser Markdown dan tinjau opsi HTML mentah, plugin, serta URL.
- ✓Bersihkan HTML akhir dengan sanitizer allowlist yang terawat tepat sebelum tujuan HTML.
- ✓Batasi elemen, atribut, dan protokol URL pada fitur yang dibutuhkan.
- ✓Jangan edit atau parse ulang markup setelah sanitasi; bersihkan kembali setelah transformasi yang diperlukan.
- ✓Uji konfigurasi parser dan tujuan rendering yang sebenarnya, serta perbarui sanitizer.
Pertanyaan umum
Tindakan ini menghapus satu fitur input, tetapi tidak membuktikan keamanan dengan sendirinya. Periksa tautan, gambar, ekstensi, HTML hasil render, dan konteks penyisipan; bersihkan output sebelum memasukkannya sebagai HTML.
Sebaiknya jangan. Perubahan berikutnya dapat memasukkan markup berbahaya atau membatalkan keputusan sanitizer. Lakukan transformasi terlebih dahulu, lalu sanitasi sebagai langkah terakhir.
Tidak. Gunakan untuk fragmen HTML sesuai model ancaman terdokumentasi, perbarui secara berkala, terapkan kebijakan sempit, dan jangan gunakan ulang hasilnya dalam konteks lain seperti string JavaScript atau CSS.
Referensi
- Spesifikasi CommonMark — HTML mentah
- Dokumentasi Marked — peringatan keamanan
- DOMPurify — README dan panduan penggunaan
- OWASP — Pencegahan Cross-Site Scripting
- flawopen.com — Cross-Site Scripting