flawopen.com/XSS in JavaScript/Vue v-html
XSS-Risiko durch Vue v-html
Vues Interpolation {{ comment }} ist wie ein Zettel hinter Glas: spitze Klammern bleiben sichtbarer Text. v-html weist den Browser an, den Zettel als HTML zu öffnen. Stammt das Markup vom Nutzer, kann der Browser es als Seitenstruktur oder aktiven Inhalt behandeln und dadurch ein XSS-Risiko schaffen.
<p v-html="comment"></p>
// comment wird als echtes Markup interpretiert
<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>
Rich-HTML vor v-html bereinigen
Verwende Vues Interpolation {{ }}, wenn der Inhalt Text sein soll. Erfordert eine Funktion tatsächlich nutzergeschriebenes Rich-HTML, bereinige es mit einer gepflegten Bibliothek wie DOMPurify und einer engen Allowlist; binde an v-html nur das bereinigte Ergebnis. Halte den Sanitizer aktuell und teste die erlaubten Markup-Regeln. Bereinigung senkt das Risiko, macht beliebiges HTML aber nicht in jedem Kontext sicher. Nutze ein isoliertes iframe, wenn aktive Inhalte nicht vertrauenswürdig bleiben müssen. Vue kompiliert v-html-Inhalte nicht als Vue-Templates.
v-html prüfen und Datenfluss verfolgen
Suche nach allen v-html-Bindungen. Ermittle jeweils Quelle, Sanitizer und Konfiguration sowie alle Personen, die den gerenderten Inhalt sehen können. Markiere direkte Nutzereingaben, gespeicherte Kommentare, CMS-Felder und API-Antworten; prüfe, ob normaler Text interpoliert wird.
grep -rn "v-html" --include="*.vue" .Häufige Fragen
Beide umgehen den normalen Text-Escaping-Pfad des Frameworks und fügen HTML ins DOM ein. Nutze für erforderliches Rich-HTML einen gepflegten Sanitizer und behandle dessen Ausgabe nicht als universell sicher.
Referenzen
- Vue.js — Sicherheit: HTML-Inhalte
- DOMPurify — Dokumentation des HTML-Sanitizers
- OWASP — Schutz vor Cross-Site Scripting
- flawopen.com — XSS in JavaScript