FlawOpen

flawopen.com/XSS/Rendering Markdown

Apakah rendering Markdown aman dari XSS?

Panduan referensi
Jawaban singkat

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

TIDAK AMAN — sisipkan output yang belum dibersihkan
const html = marked.parse(userMarkdown);
container.innerHTML = html; // output parser belum dibersihkan
DIPERKUAT — bersihkan tepat sebelum tujuan HTML
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

Pertanyaan umum

Apakah menonaktifkan HTML mentah membuat Markdown aman?

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.

Bolehkah HTML diubah setelah dibersihkan?

Sebaiknya jangan. Perubahan berikutnya dapat memasukkan markup berbahaya atau membatalkan keputusan sanitizer. Lakukan transformasi terlebih dahulu, lalu sanitasi sebagai langkah terakhir.

Apakah DOMPurify membuat semua output aman dalam setiap konteks?

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

Lihat juga Cross-Site Scripting (XSS, CWE-79): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Apakah Svelte aman dari XSS secara default? Apakah unggahan SVG berisiko XSS? Risiko XSS pada Vue v-html WKWebView: HTML tak tepercaya aman? Apa beda XSS reflected, stored, dan DOM-based? Risiko keamanan addJavascriptInterface di Android