FlawOpen

flawopen.com/XSS pada JavaScript/Vue v-html

Risiko XSS pada Vue v-html

Halaman referensi
Penjelasan sederhana

Interpolasi Vue {{ comment }} seperti menampilkan catatan kutipan di balik kaca: tanda kurung sudut tetap menjadi teks. v-html meminta browser membuka catatan sebagai HTML. Jika markup dikendalikan pengguna, browser dapat memprosesnya sebagai struktur halaman atau konten aktif sehingga menimbulkan risiko XSS.

RENTAN — HTML mentah dari pengguna
<p v-html="comment"></p>
// comment diproses sebagai markup sungguhan
DIPERBAIKI — rich HTML yang disanitasi
<script setup>
import { computed } from 'vue'
import DOMPurify from 'dompurify'

const props = defineProps({ comment: String })
const safeComment = computed(() =>
  DOMPurify.sanitize(props.comment ?? '', {
    ALLOWED_TAGS: ['p', 'strong', 'em'],
    ALLOWED_ATTR: []
  })
)
</script>

<template>
  <div v-html="safeComment"></div>
</template>

Sanitasi rich HTML sebelum v-html

Utamakan interpolasi Vue {{ }} jika konten seharusnya berupa teks. Jika fitur benar-benar memerlukan rich HTML buatan pengguna, sanitasi dengan library terawat seperti DOMPurify dan allowlist yang sempit; hanya ikat hasil yang sudah disanitasi ke v-html. Perbarui sanitizer dan uji kebijakan markup yang diizinkan. Sanitasi mengurangi risiko, tetapi tidak membuat semua HTML aman dalam setiap konteks; gunakan iframe terisolasi jika konten aktif harus tetap tidak tepercaya. Vue tidak mengompilasi konten v-html sebagai template Vue.

Audit v-html dan telusuri aliran data

Cari semua binding v-html. Untuk tiap temuan, identifikasi sumber, sanitizer beserta konfigurasinya, dan siapa yang dapat melihat konten hasil render. Tandai input langsung dari pengguna, komentar tersimpan, kolom CMS, dan respons API; pastikan teks biasa memakai interpolasi.

grep -rn "v-html" --include="*.vue" .

Pertanyaan umum

Apakah risikonya sama dengan dangerouslySetInnerHTML di React?

Keduanya melewati jalur escape teks normal framework dan memasukkan HTML ke DOM. Gunakan sanitizer terawat jika rich HTML memang diperlukan, dan jangan menganggap hasil sanitasi aman di semua konteks.

Referensi

Lihat juga Cross-Site Scripting (XSS, CWE-79): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com WKWebView: HTML tak tepercaya aman? Apa beda XSS reflected, stored, dan DOM-based? Risiko keamanan addJavascriptInterface di Android Perlindungan XSS Angular: default aman dan API bypass XSS akibat MIME sniffing: Content-Type dan nosniff CSP dan output escaping: apakah keduanya diperlukan?