在Vue3中防止XSS攻击,可以采取以下措施:
1. 利用Vue的自动HTML转义
Vue默认会对模板中的双花括号插值({{ }}
)进行HTML转义,将内容作为纯文本显示。
<template>
<div>{{ userContent }}</div> <!-- 自动转义HTML -->
</template>
2. 谨慎使用v-html
指令
v-html
会直接渲染原始HTML,需确保内容可信并提前清理:
<template>
<div v-html="sanitizedContent"></div>
</template>
<script setup>
import DOMPurify from 'dompurify';
const rawContent = '<span onmouseover="alert(1)">用户内容</span>';
const sanitizedContent = DOMPurify.sanitize(rawContent); // 使用DOMPurify清理
</script>
3. 安全处理动态属性绑定
动态绑定URL、样式等属性时,需验证和过滤数据:
<template>
<a :href="safeUrl">链接</a>
</template>
<script setup>
const userInput = 'javascript:alert(1)';
const safeUrl = userInput.startsWith('http') ? userInput : '#'; // 过滤危险协议
</script>
4. 避免拼接用户输入到可执行代码
不要将用户输入直接拼接到模板表达式或事件处理中:
<!-- 错误示例 -->
<div :onclick="`alert('${userInput}')`"></div>
5. 使用第三方安全库
6. 配置内容安全策略(CSP)
通过HTTP头Content-Security-Policy
限制资源加载和执行,例如:
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'
7. 服务端渲染(SSR)额外措施
- 服务端需对插入Vue组件的数据进行转义,避免混合注入。
- 使用Vue官方SSR方案(如Nuxt.js),确保自动转义逻辑一致。
8. 前后端协作防护
- 后端验证:对用户输入进行严格校验和过滤。
- 输出编码:后端返回数据时,根据上下文(HTML/URL/JS)进行编码。
总结
Vue3的内置转义和开发者主动防护(如清理、验证、CSP)结合,能有效抵御XSS。始终遵循最小信任原则,对所有不可信数据保持警惕。