必须转义的字符只有五个:&、、"、';其中&最危险,因其是所有html实体的起始符,未转义会导致后续内容被误解析为实体或截断,还可能引发xss漏洞。

HTML转义字符不是“要不要用”的问题,而是“在哪用、怎么用、用几遍”必须搞清的事。漏掉&或顺序错,轻则内容截断,重则触发XSS。
哪些字符必须转义?只这五个
绝大多数场景下,只需处理:&、、<code>>、"、'。其他字符不强制转义,加了反而增加体积、降低可读性。
-
&最危险——所有实体都以它开头,未转义的&可能让变成<code>再被二次解析 和<code>>在纯文本里有时能侥幸通过,但一旦混入用户输入(比如搜索词<script></script>),立刻变成标签注入入口-
"和'只在属性值中生效,比如title="User's input"——漏转单引号,属性提前闭合,后面内容直接进DOM
转义顺序为什么不能乱?
必须先转&,再转和<code>>。否则会被替换成<code>,而<code>&还没处理,结果变成<,最终页面显示而不是<code>。
正确写法(JS示例):
text = text.replace(/&/g, '&')
.replace(/, '/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''')
注意:'在XML中标准,在HTML4中部分老浏览器不支持,如需兼容可改用'或直接用双引号包裹属性值。
innerHTML插入前不转义=开XSS后门
只要用element.innerHTML = userContent,就等于把字符串交由浏览器重新编译。哪怕只是昵称alice<script>alert(1)</script>,也会执行。
- 别信“我只显示文字”,
innerHTML不管内容是什么,一律走HTML解析流程 -
textContent安全,但它会干掉所有HTML格式,连<br>
都变纯文本 - 想保留部分HTML(如富文本里的
<strong></strong>),必须配合白名单过滤,不能只靠转义 - 服务端吐出已转义的HTML(如Django的
{{ value|escape }}),前端不要再用innerHTML塞一次,否则双层编码:原始→<code>→<code><
显示转义字符本身(比如想让用户看到四个字母)
这不是转义问题,是“阻止浏览器解析”的问题。浏览器看到,默认就还原成<code>;要让它原样显示,得对<code>&本身再转义一次:
- 想显示
字面量 → 写成<code>< - 想显示
&→ 写成& - JS动态插入时,
el.textContent = "会显示四个字符;<code>el.innerHTML = "会显示一个<code> document.createTextNode("最彻底,但无法嵌套样式或HTML节点
真正容易被忽略的是:模板引擎(如EJS、Jinja2)对变量插值的自动转义,只作用于传入的原始字符串,不作用于你手写的字面量——后者会被当真实实体解析。要显示字面量,必须传双转义字符串,或关掉autoescape再手动处理。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











