深入理解 <; 和 >;:HTML 实体转义的核心指南!!!

深入理解 < 和 >:HTML 实体转义的核心指南(2026 最新版)

<> 是 HTML 中最危险也最容易被误用的两个字符。
不转义它们 → 立即引发 XSS(跨站脚本攻击);
转义错误 → 页面显示乱码、布局崩坏、SEO 失效。

下面是从原理 → 实战 → 安全 → 工具的完整闭环指南,2026 年前端(React / Vue / Svelte / Solid / Astro)必备。

1. 为什么必须转义?(核心原理)

HTML 解析器把以下 5 个字符视为特殊标记

字符原始含义必须转义为实体不转义后果
<标签开始&lt;被解析为标签 → XSS / 布局崩
>标签结束(多数情况)&gt;在某些上下文引发解析错误
&实体开始&amp;后面字符被当成实体解析
属性值双引号&quot;属性提前闭合
属性值单引号&apos;(HTML5 可选)同上

历史根源:HTML 来自 SGML(1986),实体转义是“告诉解析器:这个字符是普通文本,不是标记”的唯一方式。

浏览器行为(2026 标准)

  • 文本节点<div>这里的内容</div>)中,< 必须转义,否则解析器认为新标签开始。
  • 属性值中,"& 必须转义。
  • > 在大多数现代浏览器里可以不转义(HTML5 宽松),但强烈建议一直转义,防止旧浏览器 / XML / RSS / SVG 出错。

2. 完整实体转义表(前端日常够用 Top 12)

显示结果实体写法十进制十六进制备注
<&lt;<<最重要
>&gt;>>推荐始终转义
&&amp;&&第二重要
&quot;属性必转
&apos;HTML5 支持
 &nbsp;  防止空格被合并
©&copy;©©版权
×&times;××乘号
÷&divide;÷÷除号
&mdash;破折号
&hellip;省略号
&euro;欧元

3. 不同上下文的正确转义方式(2026 实战)

3.1 纯 HTML / 模板

<!-- 正确 -->
<div>用户输入:&lt;script&gt;alert(1)&lt;/script&gt;</div>

<!-- 错误(XSS) -->
<div>用户输入:<script>alert(1)</script></div>

3.2 JavaScript 动态插入(最容易出错)

// ❌ 危险
element.innerHTML = userInput;                    // 直接拼接

// ✅ 推荐方式 2026
element.textContent = userInput;                  // 自动转义 < > & 

// 或手动转义函数(兼容所有框架)
function escapeHtml(unsafe) {
  return unsafe
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&apos;");
}

3.3 React(2026 推荐)

// 1. 最安全(推荐)
<div>{userInput}</div>          // React 自动转义

// 2. 需要 HTML 时必须净化
import DOMPurify from 'dompurify';
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(userInput) }} />

3.4 Vue 3(2026)

<!-- 自动转义 -->
<div>{{ userInput }}</div>

<!-- 需要 HTML -->
<div v-html="sanitizedInput"></div>   <!-- 必须先 DOMPurify -->

3.5 Svelte / Solid / Astro

  • Svelte:{@html ...} 必须净化
  • Solid:<div innerHTML={...}> 需净化
  • Astro:默认安全,set:html 需手动净化

4. 常见坑 & 2026 年新问题

  1. Markdown 转 HTML:很多库(marked、remark)默认不转义 → 必须配合 sanitize
  2. 模板字符串 + innerHTML:模板${userInput} → 仍需手动 escape。
  3. SVG / MathML 内嵌<><svg> 里也必须转义,否则解析失败。
  4. JSON 里包含 HTML:先 JSON.stringify,再 escapeHtml。
  5. CSP(Content-Security-Policy)严格模式unsafe-inline 被禁用后,innerHTML 直接失效,必须走 textContent + 实体。
  6. AI 生成代码(Cursor / Claude):AI 经常忘记转义 → 必须在 prompt 里加一句 “Always use escapeHtml for any user content”。

5. 生产级安全方案(推荐组合)

场景推荐方案一行代码示例
普通文本textContent / {{ }}el.textContent = input
需要富文本DOMPurify + 实体转义DOMPurify.sanitize(input, {ALLOWED_TAGS: [...]})
大规模渲染he 库(最快)he.encode(input)
React 全站react-escape-html + DOMPurify全局拦截
Node.js 服务端渲染sanitize-html服务端先净化再返回

最强组合(2026 共识)

npm install dompurify he
import DOMPurify from 'dompurify';
import he from 'he';

const safeHtml = he.encode(DOMPurify.sanitize(rawHtml));

6. 一句话总结 + 检查清单

核心原则

  • 所有用户输入在插入 DOM 前必须转义(或用框架自动机制)。
  • &lt;&gt; 是“告诉浏览器:我就是想显示 < 和 >”的唯一正确方式。
  • 永远不要相信“浏览器会自动处理”——它只在 textContent 里处理。

每日代码审查清单(复制到 Notion / Cursor Rule):

  • [ ] 所有 innerHTML / v-html / dangerouslySetInnerHTML 是否经过净化?
  • [ ] 所有用户内容是否走 textContentescapeHtml
  • [ ] Markdown / AI 生成的内容是否加了 sanitize?
  • [ ] 测试输入:<script>alert(1)</script>&lt;img src=x onerror=alert(1)&gt;

掌握了 <> 的实体转义,你就掌握了前端安全的第一道防线

需要我立刻给你:

  • 完整的 escapeHtml 工具函数(支持 React/Vue/Svelte 多版本)
  • DOMPurify + Tailwind 的企业级配置模板
  • 针对 Cursor / Claude 的防 XSS Prompt 模板

直接说场景,我 30 秒给你发完整代码!

文章已创建 4845

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部