必须转义,否则html解析器会误判为标签起始导致dom错乱;属性值中"和&也需转义;js上下文中仅html转义不足,须按上下文选择json编码等对应方案。

和 <code>> 必须转义,否则浏览器会当作标签解析,轻则内容消失,重则触发 XSS。
为什么 不转义会导致页面崩
HTML 解析器看到 就启动标签匹配逻辑。哪怕它出现在 <code><p></p> 文本内容里,比如 <p>1 </p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill4293" title="Doc To HTML"><img
src="https://img.php.cn/upload/skill/000/000/081/178998486916110.jpg" alt="Doc To HTML" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill4293" title="Doc To HTML" class="overflowclass">Doc To HTML</a>
<p class="overflowclass">使用 MinerU 文档处理引擎将 Word 文档(.doc、.docx)转换为保留结构和格式的干净 HTML。</p>
</div>
<a rel="nofollow" href="/xiazai/skill4293" title="Doc To HTML" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>,解析器会尝试把 当成一个未闭合的标签,后续 DOM 结构直接错乱。
- 常见错误现象:
<div>price 渲染后只剩 <code>price,消失 <li>在 <code>textarea或pre里也不安全:这些元素虽是“原始文本容器”,但内部若出现未转义的,仍可能被解析为嵌套标签(尤其当后面紧跟字母时,如 <code><script>)</script> - XML、RSS、SVG 等基于 XML 的格式更严格:不转义
直接报解析错误,不是警告 - 旧浏览器(IE8 及更早)对
>不转义支持不稳定 - 嵌入式场景(如 Markdown 渲染器、模板引擎预处理)常把
>当作语法分隔符,未转义易导致截断 - 与
配对使用时,不统一转义会让代码可读性下降,也增加维护成本 - 错误示例:
@#@#@#@#@#@#@#@#@#@0→ 实际解析为href="page?id=1,后面全丢 - 正确写法:
@#@#@#@#@#@#@#@#@#@0 - 单引号属性值同理:
<div data-msg="It" s ok> 会崩,得写成 <code><div data-msg="It's OK"> <h3>JS 注入场景下,仅靠 HTML 转义不够</h3> <p>用户输入如果最终要插入到 JS 字符串里(比如 <code>onclick="alert('<user_input>')" </user_input>),光转义和 <code>>毫无意义——攻击者可以直接写");alert(1);//。这时候必须用语言层转义:- 服务端输出到内联 JS 时,应使用 JSON 编码(如 Python 的
json.dumps()、Node.js 的JSON.stringify()) - 前端动态插入时,避免拼接字符串,优先用
textContent或dataset;非要用innerHTML,先过 DOMPurify 等 sanitizer -
&在 JS 上下文里比更危险:它是唯一能触发实体解析的字符,且 JS 引擎不校验实体合法性
真正容易被忽略的点是:转义动作必须发生在“上下文确定之后”。同一段用户输入,插进 HTML 文本、属性值、JS 字符串、CSS content 属性,需要的转义规则完全不同——没有万能函数,只有上下文感知的编码。
- 服务端输出到内联 JS 时,应使用 JSON 编码(如 Python 的
> 转不转?看场景
HTML5 允许在大多数文本上下文中省略 > 转义,但这是“宽容解析”而非“推荐行为”。它只在 后紧跟字母或数字时才容易出问题(如 <code><div>),单独的 <code>> 通常能被正确识别为文本。但风险依然存在:
所以实际开发中,只要写了 ,就顺手把 <code>> 也转了——<div> → <code><div>,别省那两个字符。
<h3>属性值里 <code>" 和 & 更容易翻车
属性值用双引号包裹时,里面的 " 必须转成 ",否则属性提前闭合;& 必须转成 &,否则会被当成实体开头,引发意外解码(比如 © 被误解析为 ©)。










