MV Tools

实用文本编码往返演示

理解 Base64、URL 编码和 HTML 实体:不要把它们当成加密

让文本通过数据格式、URL 和 HTML 时保持原意的实用方法:明确每种编码解决什么问题,也明确它们不解决什么问题。

MV Tools 编辑团队更新于 约 8 分钟阅读

打开工具

先看目标位置,而不是只看“编码”二字

Base64、百分号编码和 HTML 实体解决的是不同的表示问题。它们不会加密消息、证明发布者身份、验证输入,也不会让一个值在所有上下文中都安全。先确认该值最终由哪里读取:字节字段、URL 的一个组成部分,还是作为文本显示的 HTML。

在接收系统正确接受并显示转换结果前保留原值。字符串转换后即使语法有效,也可能因为在错误层级编码或重复编码而不符合目标用途。

Base64 改变 UTF-8 字节的表示形式,不会隐藏源文本。
Base64 改变 UTF-8 字节的表示形式,不会隐藏源文本。

Base64 用于把字节表示为文本,不用于保密

Base64 将字节映射为有限的 ASCII 字符集。此工具先把 Unicode 输入转为 UTF-8 字节,再编码为 Base64;有效的 UTF-8 Base64 可按相反方向解码。当纯文本格式需要承载字节序列时它很有用,但通常会增加体积,而且任何拿到该值的人都很容易还原。

不要把凭据、个人信息或访问令牌转成 Base64 后就认为它们受到了保护。应使用目标系统要求的加密和访问控制机制。需要互操作时,保留接收方要求的完整值和填充符;标准 Base64 与 URL 安全 Base64 并非总能互换。

往返测试只确认表示一致,不代表保密或授权。
往返测试只确认表示一致,不代表保密或授权。

先编码 URL 组件,再拼接 URL

搜索词等查询参数值可能包含空格、&、=、Unicode 或百分号。应先把这个值作为组件编码,再拼入查询字符串,这样值中的 `&` 或 `=` 不会变成 URL 结构。例如先编码值,再把它放在 `?q=` 后面;不要对已经完整的 URL 使用组件编码。

只有明确要保留 `://`、`?`、`&`、`=`、`#` 等分隔符时才使用完整 URL 编码。不要盲目解码整条 URL,更不要重复解码:一次解码后,已转义的百分号可能变成新的转义序列。可优先使用框架或 URL API 构造参数,并用含空格、非 ASCII 文字、`&`、`=`、`%` 的样例测试。

&、=、空格、Unicode 和百分号都保留在该值内部。
&、=、空格、Unicode 和百分号都保留在该值内部。

HTML 转义必须匹配插入位置

HTML 实体编码用于把特殊字符显示为文本。此工具会将 `&`、`<`、`>`、双引号、单引号和反引号转换为实体,也可将已识别实体还原。它适合显示代码示例或 HTML 中的字面文本,但不是任意标记的通用清理器。

输出安全与上下文相关。文本节点、带引号属性、不带引号属性、URL、CSS 和 JavaScript 各有不同规则。优先使用框架模板转义和 DOM API,不要自行拼接字符串。即使需要允许有限 HTML,也应采用经过审查的清理策略,不要把通用实体编码器当作向 HTML 注入不可信内容的许可。

实体编码适合显示字面文本,不是广泛清理标记的手段。
实体编码适合显示字面文本,不是广泛清理标记的手段。

发布前用小型往返测试确认

先用可丢弃样例测试,其中包含普通文本、Unicode、空格、`&`、`=`、`%`、引号和尖括号。针对目标位置只编码一次,按应用的真实路径传递,在目标处解码或渲染,再与原值比较。确认没有参数被拆开、文本没有改变、内容也没有被解释为标记。

这三个 MV Tools 转换器都在浏览器中运行:输入、结果、复制和 data URL 下载不会上传到 MV Tools。本地处理不代表可以随意粘贴生产敏感值;请使用脱敏样例,保护带签名 URL 和 token,并将正式源数据留在其所属系统中。

实际输出场景应使用框架转义和 DOM API。
实际输出场景应使用框架转义和 DOM API。

常见问题

Base64 是加密吗?

不是。它是可逆的字节表示,拿到值的人通常都能解码,因此不提供保密性。

为什么一个 URL 参数变成了多个参数?

通常是拼接前没有对单个值进行组件编码,导致 & 或 = 被当成 URL 语法。请先编码值,再构造 URL。

HTML 转义会让不可信 HTML 安全吗?

不会自动做到。转义必须匹配输出上下文;任意 HTML 应采用明确的清理策略,而不是字符串注入。