什么是HTML 实体编码/解码器?
HTML 实体编码/解码器可将 <、>、& 及引号等特殊字符与其 HTML 实体表示(如 <、>)相互转换。这可有效防止在 HTML 中嵌入用户内容时产生 XSS 漏洞,并解决特殊字符的显示异常问题。
编码器将 <, >, &, ", ' 等字符和任何 Unicode 码点转换为命名实体(&, <)、十进制数字引用(&)或十六进制数字引用(&)。范围选择器允许只编码五个保留字符、所有特殊字符或每个非 ASCII 字符。解码可还原三种格式中的任意一种。适用于为 HTML 输出净化用户输入或从 HTML 邮件导出中恢复文本。
使用方法
- 第一步 — 粘贴含有特殊字符或 HTML 实体的文本。
- 第二步 — 选择编码将字符转换为实体,或选择解码将实体还原为字符。
- 第 3 步 — 选择格式(命名、十进制或十六进制)和范围来控制编码强度。
何时使用
- 把代码示例贴进 CMS,避免 < 和 > 被当成 HTML 标签而消失。
- 整理从 HTML 邮件或抓取页面里复制下来,还残留着 —、 的文本。
- 在服务端模板里输出用户输入前先做转义,避免 XSS 注入。
结果
您需要在 HTML 段落中展示代码片段 <div class=hero>。对其进行编码,得到 <div class="hero">,本地将以文本形式渲染,而不会将其解析为 HTML 标签。
常见问题
- 命名实体和数字实体有什么区别?
- 命名实体用可读的简写,例如 © 表示 ©。数字实体用 Unicode 码点,例如 © 或十六进制 ©。数字实体能表示任何 Unicode 字符;命名实体只覆盖 HTML5 规范定义的约 250 个字符。
- 是不是所有特殊字符都要编码?
- 在 HTML 正文中只需编码 & < > 以及属性值用到的引号。在 JavaScript 或 URL 上下文中规则不同。范围选择器提供三种选择:仅保留字符 — 针对五个 XSS 关键字符,所有特殊字符 — 在保留字符之外加入排版符号,所有非 ASCII — 提供最全面的覆盖。
- 编码后会不会影响复制粘贴或屏幕阅读器?
- 不会。浏览器在渲染前会先把实体解码,用户看到和复制到的都是原始字符。屏幕阅读器拿到的也是解码后的文本。实体只是标记语言里的传输形式,不是最终展示。
- 光做 HTML 实体编码能防住 XSS 吗?
- 对放在 HTML 正文里的内容,够了。放在属性里还要给属性加引号并把引号字符一起编码。JavaScript、CSS、URL 这些上下文有各自的转义规则,编码只是第一层防护,不是全部。
- 为什么有的实体写 &#x,有的只写 &#?
- &#x 后面跟的是十六进制码点,&# 后面是十进制。两者指向同一个字符,例如 © 和 © 都是 ©。十六进制和 Unicode 表里 U+ 写法对应,高位码点写起来更短。