
Vue.js 默认对 {{ }} 插值内容进行 HTML 实体转义,因此直接渲染用户输入(如 {{ inputed_text }})不会触发 XSS;但若使用 v-html 或服务端未净化就存储/跨系统共享数据,仍存在真实风险。
vue.js 默认对 `{{ }}` 插值内容进行 html 实体转义,因此直接渲染用户输入(如 `
{{ inputed_text }}
`)不会触发 XSS;但若使用 `v-html` 或服务端未净化就存储/跨系统共享数据,仍存在真实风险。
在 Vue.js 应用中,仅依赖前端模板语法的安全特性是不够的。你观察到 <p>{{ inputed_text }}</p> 对 <script>alert('XSS')</script> 等载荷无反应,这是正确的——Vue 2/3 均会对 {{ }} 内容自动执行 HTML 转义(HTML-escaping),将 → <code>、<code>> → >、" → " 等,从而阻断标签解析与脚本执行。这意味着:
✅ 安全场景(默认行为):
<!-- 即使 inputed_text = "<script>alert(1)</script>" -->
<p>{{ inputed_text }}</p>
<!-- 渲染结果为纯文本:<script>alert(1)</script> -->
⚠️ 危险场景(绕过 Vue 自动防护):
- 使用
v-html强制解析 HTML(如<div v-html="inputed_text"></div>); - 将未净化的数据用于
:href、:src、@click等动态绑定属性(如<a :href="'javascript:' + userUrl"></a>); -
更关键的是:数据持久化后被其他系统(非 Vue)直接渲染(如后台管理页用 jQuery
.html()显示、邮件模板拼接、导出 PDF 等)。
因此,真正的安全防线必须落在服务端。不能因 Vue 当前“看起来安全”而跳过输入净化——因为数据库不是 Vue 的专属领地。
✅ 推荐实践:服务端输入净化(黑名单 + 白名单结合)
虽然正则黑名单(如 /(]+>)/ig)可快速过滤基础 HTML 标签,但仅靠黑名单易被绕过(例如 alert(1)、<img>)。更稳健的做法是:
-
优先采用成熟库进行 HTML 净化(推荐):
// Node.js 示例:使用 sanitize-html(白名单策略) const sanitizeHtml = require('sanitize-html'); const clean = sanitizeHtml(userInput, { allowedTags: ['b', 'i', 'em', 'strong'], // 仅允许特定格式标签 allowedAttributes: {}, // 禁用所有属性(避免 onclick/onerror 等) disallowedTagsMode: 'recursiveEscape' // 非法标签转义而非删除 }); -
若必须用正则,增强防御层级:
// 更严格的多层过滤(示例,不可替代专业库) function sanitizeInput(str) { if (!str) return ''; // 1. 移除 script/style 标签及注释 str = str.replace(/<script>/gi, ''); str = str.replace(/<style[\s\S]*?<\/style>/gi, ''); str = str.replace(/<!--[\s\S]*?-->/g, ''); // 2. 移除危险事件属性(onxxx=) str = str.replace(/on\w+\s*=\s*["'].*?["']/gi, ''); // 3. 最终转义剩余尖括号和引号 return str .replace(/&/g, '&') .replace(/, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }</script>
⚠️ 重要注意事项
- ❌ 不要依赖前端 JavaScript 净化:攻击者可绕过前端校验,直接调用 API 提交恶意数据;
- ✅ 始终假设所有用户输入都是不可信的,无论来源(表单、URL 参数、API 请求体);
- ✅ 数据库存储前净化,而非读取时处理——确保“一次净化,处处安全”;
- ✅ 若业务需富文本,务必使用专业编辑器(如 Quill、Tiptap)+ 服务端白名单净化,禁用
v-html直接渲染原始 HTML; - ✅ 定期审计:检查是否存在
v-html、:innerHTML、document.write()等高危用法。
总之,Vue 的模板插值是可靠的第一道屏障,但纵深防御要求你在服务端切断恶意载荷的源头。净化不是“过度设计”,而是保障数据在全栈生命周期中始终可信的基石。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











