FlawOpen

flawopen.com/XSS di JavaScript/dangerouslySetInnerHTML

Apakah dangerouslySetInnerHTML di React aman?

Halaman referensi
Jawaban singkat

Bayangkan JSX biasa sebagai printer label: teks tetap menjadi teks. dangerouslySetInnerHTML beralih ke mesin cetak yang menafsirkan string sebagai HTML. Jika string memuat konten yang dikendalikan penyerang, browser dapat memperlakukannya sebagai markup aktif. Gunakan titik keluaran ini hanya untuk HTML yang memang tepercaya atau telah disanitasi untuk konteks HTML yang tepat.

Mengapa JSX biasa tidak memerlukannya

BERISIKO — HTML mentah
function Comment({ html }) {
  return <p dangerouslySetInnerHTML=
    {{ __html: html }} />;
}
AMAN — interpolasi JSX biasa
function Comment({ text }) {
  return <p>{text}</p>;
}

Kapan dangerouslySetInnerHTML layak digunakan?

Gunakan hanya ketika produk perlu mempertahankan format rich text terbatas yang tidak dapat direpresentasikan sebagai anak React biasa. CMS, editor, atau renderer Markdown tidak otomatis tepercaya: konten tersimpan dan keluaran renderer tetap dapat berisi markup yang tidak tepercaya. Tentukan elemen dan atribut yang diizinkan, sanitasi dengan pustaka HTML yang dipelihara seperti DOMPurify, lalu kirim hasilnya langsung ke titik keluaran ini.

Cara penggunaan yang benar

Sanitasi pada batas rendering

Sanitasi tepat sebelum memberikan nilai ke dangerouslySetInnerHTML dengan pustaka terpelihara seperti DOMPurify. Jangan memakai ekspresi reguler sebagai sanitizer HTML. Hindari mengubah string setelah sanitasi karena transformasi berikutnya dapat membatalkan jaminannya. Perbarui sanitizer dan lingkungan parser-nya.

Batasi markup yang diizinkan

Daftar blokir tag yang dikenal tidak cukup: risiko juga dapat berasal dari atribut, bidang URL, namespace, dan perilaku parser. Tentukan daftar kecil elemen dan atribut yang diperlukan fitur, lalu konfigurasi sanitizer sesuai kebijakan tersebut. Tinjau tautan dan atribut URL lainnya secara terpisah berdasarkan tujuan yang diizinkan produk.

Cara memeriksa kode

grep -rn "dangerouslySetInnerHTML" --include="*.jsx" --include="*.tsx" .
Untuk setiap temuan, telusuri nilai dari sumbernya melalui semua transformasi. Perlakukan input pengguna, konten impor, dan rich text tersimpan sebagai tidak tepercaya; pastikan kebijakan sanitizer sesuai konteks keluaran dan tidak ada langkah berikutnya yang mengubah hasil sanitasi.

Pertanyaan umum

Apakah rendering Markdown otomatis aman?

Itu bergantung pada renderer dan konfigurasinya. Periksa apakah HTML mentah diterima dan apakah keluarannya disanitasi; konversi Markdown saja tidak membuat HTML aman.

Apakah ini juga berlaku untuk v-html di Vue?

Ya. v-html juga memberikan HTML kepada browser tanpa interpolasi teks biasa dari framework. Perlakukan nilainya sebagai titik keluaran HTML dan sanitasi konten tidak tepercaya dengan kebijakan yang sesuai.

Referensi

Lihat juga Cross-Site Scripting (XSS, CWE-79): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Apakah DOMPurify cukup untuk mengamankan innerHTML? Apakah rendering Markdown aman dari XSS? Apakah Svelte aman dari XSS secara default? Apakah unggahan SVG berisiko XSS? Risiko XSS pada Vue v-html WKWebView: HTML tak tepercaya aman?