html实体转义必须处理且仅需处理五个基础字符:&、、"、',其中&最危险;命名实体适用于ascii符号,数字编码更通用;innerhtml插入前必须转义,textcontent仅适用于纯文本场景。

HTML实体字符不是“要不要用”的问题,而是“在哪用、怎么写、顺序错不得”的实操细节。该转的五个基础字符(&、、<code>>、"、')漏掉任何一个,都可能让页面错位、属性截断,甚至触发XSS。
哪些字符必须转义?只这五个,但&最危险
浏览器解析HTML时只对这五个字符有“特殊期待”:
-
&是所有实体的开头,未转义会导致后续字符被误判为实体(比如变成 <code><再变成) 和 <code>>在文本节点里不转义会直接被当标签解析(<p>x </p>会被切开)-
"和'主要在属性值中生效:title="用户输入了"若没转义,"会提前闭合属性
注意:> 在HTML5中部分场景可省略,但XML、SVG、RSS里必须转;' 在老IE中更稳,现代环境可用 '。
命名实体 vs 数字实体:选哪个?看字符范围
命名实体(如 )易读但支持有限(约250个),数字实体(如 <code> 或 <code>)覆盖全部Unicode,更可靠:
- 日常符号(
、<code>&、")优先用命名实体——编辑器高亮友好,团队协作易懂 - 中文、emoji、数学符号(→、∑、?)必须用数字实体,例如
→、∑、? - 避免用
:空字符在旧IE中会崩溃,绝对禁用
JavaScript里手动转义,顺序错了就连锁出错
用 .replace() 手动转义时,顺序错误会导致双重编码(比如把 又变成 <code><):
- 必须先处理
&:.replace(/&/g, "&") - 再处理
:<code>.replace(/, " - 最后处理
>:.replace(/>/g, ">") -
"和'可按需加在中间,但不要插在&前面
更稳妥的做法是借浏览器原生逻辑:document.createElement('div').textContent = str; const escaped = temp.innerHTML;,但别在循环里高频调用——性能差。
innerHTML 赋值前必须转义,textContent 不等于安全万能
往 element.innerHTML 写任何用户数据前,不转义等于开门揖盗:
- 哪怕只是回显一个昵称:
el.innerHTML = user.name,如果值是<script>alert(1)</script>,就会执行 -
element.textContent = str确实自动规避HTML解析,但它只输出纯文本——无法保留任何格式、链接或样式 - 富文本场景(如带的评论)不能只靠转义,得配合白名单过滤,否则
<img src="x" onerror="alert(1)">还是能跑
最容易被忽略的是前后端转义对齐:后端用 htmlspecialchars($str, ENT_QUOTES) 输出了 ,前端又用JS再转一次,结果页面显示的是字面量 <code><,而不是 。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











