URL 编码解释:百分号编码、查询字符串与安全链接
URL 编码解释:百分号编码、查询字符串与安全链接
解释百分号编码、查询参数、路径片段、表单编码,以及为什么保留字符直接复制会破坏 URL。
原创流程图
URL 编码解释:百分号编码、查询字符串与安全链接
理解原理
检查后再进入下一步
检查边界
检查后再进入下一步
使用工具
检查后再进入下一步
完整 URL 可以包含 scheme、host、path、query 和 fragment。每一部分规则不同。路径里的斜杠和查询值里的斜杠含义不同。编码应在组件层完成,不应盲目编码或解码整个 URL。
百分号编码用 % 加两个十六进制数字表示一个字节。空格、非 ASCII 文本和保留字符都可在选择 UTF-8 等编码后表示。查询值里的 & 必须编码,否则会被当成新参数分隔符。
查询字符串通常由 name=value 组成,并用 & 分隔。键和值都可能需要编码。像 red & blue 这样的值不能直接拼接。使用结构化 API 重建查询字符串比手写字符串拼接更安全,也更能处理重复键和空值。
在 application/x-www-form-urlencoded 中,加号常代表空格;在其他 URL 位置,加号可能就是字面加号。搜索 URL、邮件链接和编码 token 经常因此出错。如果加号本身有意义,应测试真实接收方解析规则。
双重编码是把已经编码的值再次编码。百分号会变成 %25,所以 %20 会变成 %2520。接收方解码一次后仍看到编码文本。双重解码也危险,因为它可能把安全外观的字符串变成活跃分隔符。
# 后面的 fragment 由浏览器处理,通常不会随 HTTP 请求发给服务器。调试分析、认证跳转和客户端路由时要注意这一点。如果服务器需要该值,应放在路径或查询里。
先确定要构建的 URL 部分。把原始值和结构分隔符分开,对路径片段或查询值使用组件级编码 API。组装后再解析回来,确认参数与预期一致。用户生成链接还要验证 scheme 和 host。
常见问题
通常应编码路径片段、查询值等组件,再组装 URL 结构。
百分号被再次编码,这是双重编码的典型表现。
它能防止语法混淆,但不是完整安全控制,仍需要验证和授权。
测试空格、&、+、=、非 ASCII、空值、重复键和已含百分号的值。
不同应用可能自动解码、重编码、裁剪标点,或不同处理加号和空格。
需要,但还要验证。编码只保证它作为数据保存,不证明目的地安全。
结构化 API 理解组件边界,能减少手写拼接导致的双重编码和分隔符错误。