HTML 实体编解码工具
在文本与 HTML 实体之间双向转换,支持命名实体(& < ©)、十进制(&)与十六进制(&)数字实体,内置常用实体速查表。数据仅在浏览器本地处理。
常用 HTML 实体速查表
XSS 防御演示
选择典型攻击载荷,查看 HTML 实体编码前后的差异。本演示不会执行任何脚本,仅展示文本编码效果与上下文安全提示。
<script>alert(document.cookie)</script>若直接 innerHTML 渲染,浏览器会执行其中的 JavaScript,导致 XSS。
<script>alert(document.cookie)</script>< > " ' 被转义后,浏览器仅当文本显示,不会解析为标签或脚本。
HTML 实体编码在不同上下文的有效性
<div>用户输入</div>HTML 实体编码有效,& < > 被转义后浏览器只当文本显示,不会解析为标签。
<input value="用户输入">HTML 实体编码有效,& < > " 被转义后无法逃逸属性引号,无法注入新属性。
<script>var x = "用户输入";</script>HTML 实体无效!JS 引擎不识别实体。需用 JSON.stringify 并转义 </script> 序列。
<button onclick="run('用户输入')">HTML 实体无效!需 JS 字符串转义(\ ' " \n),并配合属性上下文编码。
<a href="用户输入">需 URL 编码 + 协议白名单(拒绝 javascript: data: 等危险协议),仅靠 HTML 实体不够。
💡 完整 XSS 防御需配合 CSP(内容安全策略)、输入校验、上下文相关编码。详见博客《前端安全实战:CSP、XSS、CSRF 防护全景指南》。
常见问题
什么是 HTML 实体?为什么需要它?
HTML 实体是用 & 开头、; 结尾的字符串表示特殊字符的机制。它有两个核心用途:①转义 HTML 语法字符(如 < > & "),避免它们被解析为标签或属性边界,防止 XSS 与显示错误;②输入键盘上难以直接输入的符号(如 © ©、® ®、™ ™、— —)。
命名实体、十进制、十六进制有什么区别?
三种写法表示同一个字符:& = & = &,都表示与号 &。命名实体用易记的名字(amp、lt、copy),但只能表示 HTML 规范中预定义的字符;十进制用 &#NN; 表示任意 Unicode 码点;十六进制用 &#xNN; 表示,常用于代码生成与编程场景。三者可混用,浏览器都会正确解析。
三种编码模式有什么区别?该如何选择?
本工具提供三种编码模式:
① 仅必要字符:只转义 & < > " ',保留中文与符号原样。适用于在 HTML 文档中安全显示用户输入的内容。
② 命名实体优先:必要字符 + 命名实体表中的符号(© ® ™ … 等)优先用命名形式,其余非 ASCII 用数字实体。可读性最好,适合邮件、文档场景。
③ 全部数字实体:所有非 ASCII 字符(含中文)都转为 &#NN;。体积最大但兼容性最高,适合纯 ASCII 通道(如老式邮件、XML 声明前的字符)。
解码时用的是什么方法?支持所有 HTML5 实体吗?
本工具使用浏览器原生 DOMParser 解码,支持 HTML5 规范中定义的所有命名实体(包括 © ® ™ — 等数百个),以及十进制 &#NN; 与十六进制 &#xNN; 数字实体。比手写映射表更完整、更准确。
HTML 实体能防止 XSS 攻击吗?
能且不能。能:在输出用户输入到 HTML 文本节点或属性值之前进行 HTML 实体编码,是防止 XSS 的标准做法(OWASP 推荐)。不能:实体编码仅在 HTML 上下文有效,如果你把用户输入插入到 <script> 内、事件处理属性(如 onclick)内、或 URL 上下文(如 href),仍可能被绕过。完整防御需配合 CSP、输入校验、上下文相关编码。本工具内置XSS 防御演示模块(见页面下方),可选择 <script> 注入、onerror 事件、javascript: 协议等典型载荷,实时查看编码前后差异与上下文安全提示。详细原理参见博客《前端安全实战:CSP、XSS、CSRF 防护全景指南》。
XSS 防御演示模块会执行脚本吗?安全吗?
不会执行任何脚本,完全安全。演示模块仅以纯文本形式展示攻击载荷的原始内容与 HTML 实体编码后的结果,所有内容通过 React 文本节点渲染(自动转义),浏览器不会将其解析为可执行代码。你可以放心选择任意预设载荷查看编码效果。模块还提供上下文安全提示表,标注 HTML 实体编码在「HTML 文本节点 / 属性值 / <script> 块内 / 事件处理器 / href 属性」五种上下文的有效性,帮助你理解为什么单一编码不能防住所有 XSS。
& 与 & 的区别?为什么会出现双重编码?
这是常见的双重编码问题。如果文本已经是 &(表示字符 &),但被错误地再次编码,会变成 &amp;,显示为字面量 & 而非字符 &。常见于后端已编码一次、前端再次编码的场景。本工具不会重复编码已编码的实体(必要字符优先匹配),但仍建议在编码前确认输入是否已是实体形式。
为什么 (不换行空格)和普通空格不一样?
(码点 U+00A0)和普通空格(U+0020)是不同的字符。不换行空格不会被浏览器换行截断,常用于防止「100 kg」被拆成两行;HTML 中连续多个 都会显示,而连续普通空格会被合并为一个。但 不应被滥用做缩进,应使用 CSS 的 margin 或 padding。
数据会上传到服务器吗?
不会。本工具完全在浏览器内运行,所有处理逻辑由 JavaScript 在你本地执行,输入内容不会发送到任何服务器。