FlawOpen

flawopen.com/JavaScript में XSS/Vue v-html

Vue v-html से XSS का जोखिम

संदर्भ पृष्ठ
आसान भाषा में

Vue का {{ comment }} interpolation ऐसा है जैसे काँच के पीछे उद्धृत पर्ची दिखाना: कोण वाले ब्रैकेट टेक्स्ट ही रहते हैं। v-html ब्राउज़र से पर्ची को HTML की तरह खोलने को कहता है। यदि markup उपयोगकर्ता के नियंत्रण में है, तो ब्राउज़र उसे पेज संरचना या active content मान सकता है और XSS जोखिम बन सकता है।

असुरक्षित — उपयोगकर्ता का raw HTML
<p v-html="comment"></p>
// comment को वास्तविक markup की तरह parse किया जाता है
सुधारा गया — साफ़ किया हुआ rich HTML
<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>

v-html से पहले rich HTML साफ़ करें

जब सामग्री टेक्स्ट होनी चाहिए, तो Vue का {{ }} interpolation प्राथमिकता दें। यदि किसी सुविधा को सच में उपयोगकर्ता-लिखित rich HTML चाहिए, तो DOMPurify जैसी अनुरक्षित library को सीमित allowlist के साथ उपयोग करें; केवल साफ़ किए गए परिणाम को v-html से bind करें। sanitizer अपडेट रखें और अनुमत markup नीति को test करें। sanitization जोखिम घटाता है, लेकिन हर HTML को हर संदर्भ में सुरक्षित नहीं बनाता; सक्रिय सामग्री को अविश्वसनीय रखते हुए दिखाना हो तो अलग iframe का उपयोग करें। Vue v-html सामग्री को Vue template की तरह compile नहीं करता।

v-html का audit करें और data flow trace करें

सभी v-html bindings खोजें। हर binding के लिए source, sanitizer और उसकी configuration, तथा rendered सामग्री देखने वाले उपयोगकर्ताओं की पहचान करें। सीधे user input, stored comments, CMS fields और API responses चिन्हित करें; सामान्य टेक्स्ट के लिए interpolation का उपयोग जाँचें।

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

आम सवाल

क्या यह React के dangerouslySetInnerHTML जैसा जोखिम है?

दोनों framework के सामान्य text-escaping रास्ते को छोड़कर HTML को DOM में डालते हैं। आवश्यक rich HTML के लिए अनुरक्षित sanitizer उपयोग करें और साफ़ किए गए output को हर संदर्भ में सुरक्षित न मानें।

संदर्भ

यह भी देखें क्रॉस-साइट स्क्रिप्टिंग (XSS, CWE-79): यह कैसे काम करती है और हर भाषा में इसे कैसे रोकें — flawopen.com WKWebView: अविश्वसनीय HTML सुरक्षित? Reflected, stored और DOM-based XSS में क्या अंतर है? Android addJavascriptInterface के सुरक्षा जोखिम Angular XSS सुरक्षा: सुरक्षित defaults और bypass APIs MIME sniffing XSS: Content-Type और nosniff CSP और output escaping: क्या दोनों चाहिए?