html转义仅将、&、"、'替换为对应实体以防止误解析,须在动态内容插入html文本上下文时使用;javascript中需用映射表避免replace顺序错误;服务端模板如ejs、django默认转义,但script内联js或url参数等场景不适用html转义。

HTML 转义本身不“提升”特殊字符,它只是把有特殊含义的字符(比如 、<code>&、")替换成对应的命名实体或数字字符引用,防止浏览器误解析为 HTML 标签或属性分隔符。用错地方反而导致显示异常或 XSS 漏洞。
哪些字符必须转义才能安全显示
只有在「将用户输入或动态内容插入 HTML 文本上下文」时,才需要转义。核心是这 5 个字符:
→ <code><(否则会被当标签开头)-
>→>(虽多数情况可省略,但属性值或严格模式下建议转) -
&→&(最易漏,未转义会导致后续实体被错误解析,如©变成©前多出乱码) -
"→"(仅在属性值用双引号包裹时必需,如title=""Hello"") -
'→'(单引号,仅在单引号包裹的属性中需要,但兼容性差,更推荐用'或改用双引号)
JavaScript 中手动转义容易踩的坑
别用简单 replace() 链——顺序和重复替换会出错。例如先替 & 再替 是对的,但如果反过来,<code>< 里的 & 会被二次处理成 。
更稳妥的做法是用映射表一次性遍历:
function escapeHtml(str) {
const map = {
'&': '&',
'': '>',
'"': '"',
"'": '''
};
return str.replace(/[&"']/g, c => map[c]);
}
注意:' 比 ' 兼容性更好;IE8 及更早版本不支持 '。
服务端模板里别依赖手动转义
像 Express + EJS 默认开启自动转义(),而 是不转义输出——选错就等于裸奔。Django 的 {{ value }} 默认转义,{{ value|safe }} 才跳过。
关键判断点:
- 你输出的位置是 HTML 文本节点?→ 用默认转义机制
- 你输出的是
href、data-属性值?→ 同样需要转义,且注意引号匹配 - 你输出的是
script标签内联 JS?→ HTML 转义无效,必须用 JSON 序列化 +JSON.parse(),或直接走 API
什么时候根本不用 HTML 转义
以下场景转义不仅多余,还会破坏功能:
- 设置
textContent或innerText(DOM API 自动处理) - 用
fetch返回 JSON,再用JSON.parse()渲染到页面(数据层已隔离) - 富文本编辑器输出的 HTML(应走
DOMPurify等 sanitizer,而非简单转义) - URL 参数值(该用
encodeURIComponent(),不是 HTML 实体)
混淆转义层级是最隐蔽的问题:后端转了一次,前端又用 innerHTML 插入,结果看到 <script> 这种字面量——说明转义被套了两层。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











