v-html本身不安全,需前置清洗+边界控制;可信内容用dompurify净化,用户输入必须后端清洗;替代方案包括markdown解析、json ast渲染或css类强调;禁用v-html于根元素、与v-if等指令共用、非字符串绑定及ssr不一致场景。

v-html 指令本身不安全,它只是把字符串原样写入 innerHTML —— 浏览器会执行其中所有 HTML、JS 和事件脚本。所以“安全使用”不是靠 v-html 实现的,而是靠前置清洗 + 合理边界控制。
只对可信内容直接用 v-html
如果富文本完全由内部运营人员在后台编辑器中发布,且系统无用户提交入口,可视为“可信”。此时仍建议走一遍轻量净化:
- 安装 DOMPurify:
npm install dompurify - 在组件中封装计算属性:
import DOMPurify from 'dompurify';<br>const safeHtml = computed(() => DOMPurify.sanitize(rawHtml));
- 模板中绑定:
<div v-html="safeHtml"></div>
用户可编辑内容必须后端清洗
评论、表单提交、富文本编辑器导出等场景,绝不能依赖前端净化。攻击者可绕过 JS 直接发请求。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- Python 后端推荐
bleach:白名单过滤标签(如只允许p、strong、a)和属性(如只允许href,且校验协议为https?) - Node.js 推荐
sanitize-html:配置allowedTags、allowedAttributes,并禁用script、onerror、javascript:等高危项 - 返回前确保字段已清洗,Vue 层只需普通绑定:
v-html="cleanedContent"
避免 v-html 的替代方案
多数业务不需要完整 HTML 支持,改用更可控的方式能彻底规避风险:
- 纯格式需求(加粗、换行、链接):用正则或 marked 解析 Markdown,转成 Vue 组件树渲染
- 结构化富文本:后端返回 JSON AST(如
{ type: "paragraph", children: [{ type: "text", value: "hello" }, { type: "bold", children: [...] }] }),前端递归渲染对应组件 - 简单强调文本:用
v-text+ CSS 类(如class="highlight")配合样式实现视觉效果
禁止踩的坑
v-html 不是万能胶,这些用法会直接报错或失效:
- 不能写在组件根元素上(Vue 会提示 “v-html can't be used on the root element”)
- 不能和
v-if、v-for、v-model共存于同一标签 - 绑定值必须是字符串类型,传对象或 null 会渲染为
[object Object]或空字符串 - SSR 场景下,服务端渲染的 HTML 和客户端 v-html 结果不一致,可能触发 hydration mismatch
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!








