必须转义的字符只有5个:&、<、>、"、',因其具有HTML语法意义,不转义会导致解析崩溃、XSS漏洞或排版错乱;其余如©、®、€等属可选转义,但在用户输入或跨环境场景中建议处理。

HTML 实体字符不是“可选装饰”,而是防止解析崩溃、XSS 漏洞和排版错乱的底层安全机制。该转不转,轻则页面结构崩坏,重则执行恶意脚本。
哪些字符必须转义?
只有 5 个字符在 HTML 解析中具有语法意义,必须转义:&、、"、'。其他符号(如 ©、®、€)属于“可选转义”,但涉及用户输入或跨环境部署时,建议一并处理。
-
&是实体起始符,未闭合的&xyz会被浏览器当作未完成实体丢弃,后续内容可能错位或截断 和 <code>>直接导致标签误解析,比如userInput = "a 若直接插入 <code>innerHTML,会提前闭合标签-
"和'在属性值中不转义会导致属性提前结束,例如:<div title="He said " hi> → 解析器在第一个 <code>"就终止了title属性什么时候该用命名实体,什么时候用数字实体?
命名实体(如
<)可读性好,但并非全部被支持;数字实体(如或 <code>)兼容性更稳,尤其在旧版 IE 或 XML 场景下。- 常用符号优先用命名:
<、>、&、"、'、©、® - emoji 或生僻 Unicode(如
??)必须用十进制或十六进制数字实体,因为没有标准命名 - XML 环境慎用命名实体——很多不预定义,
'在部分 XML 解析器中不被识别,改用'更保险
动态内容拼接时最容易踩的坑
前端直接用
innerHTML拼接用户数据是 XSS 高危操作,而仅靠后端转义也不够——前后端编码链路一旦错位,就前功尽弃。立即学习“前端免费学习笔记(深入)”;
- 永远不要写:
el.innerHTML = `<div>` + userInput + `</div>`,哪怕你确信后端已转义 - 更安全的做法是:
el.textContent = userInput(自动转义),或封装 escape 函数:el.innerHTML = `<div>${escapeHtml(userInput)}</div>` - 注意:
textContent会丢弃所有 HTML 标签,若需保留富文本,请用 DOMPurify 等库净化,而非手动替换 - URL 参数中的
&和=必须用encodeURIComponent()处理,不能依赖 HTML 实体——那是 HTML 解析层的事,不是 URL 编码层
空格类实体的隐蔽影响
普通空格在 HTML 中会被合并,
看似只是“多一个空格”,但它实际改变渲染行为:阻止换行、影响 inline 元素对齐、干扰 CSS 的white-space计算。-
(不换行空格):用于数字与单位之间(100 px)、人名分隔(张 三),避免被折行 -
(二分之一汉字宽)和(全角汉字宽):比纯 CSS margin 更轻量,适合微调中文段落缩进或表格对齐 - 不要滥用
替代 CSS 布局——它本质是内容字符,会进入 DOM 文本节点,影响可访问性和搜索索引
真正容易被忽略的,是实体和编码的双重校验:即使用了
<,如果页面没声明<meta charset="utf-8">,某些旧浏览器仍可能按 ISO-8859-1 解析,导致实体显示为乱码或空白。实体不是万能胶,它只在正确的编码上下文中才生效。 - 常用符号优先用命名:



















