12. Changes from RFC 2279 (自RFC 2279以来的变更)
本章列出了RFC 3629相对于其前身RFC 2279的主要变更。
主要变更
1. 限制字符范围 ✅
变更: 将字符范围限制为 0000-10FFFF(UTF-16可访问范围)。
影响:
RFC 2279: 允许编码到U+7FFFFFFF (6字节序列)
RFC 3629: 限制为U+10FFFF (最多4字节序列)
原因: 与UTF-16同步,这是Unicode的实际范围
技术细节:
- 旧标准允许5字节和6字节序列
- 新标准最多4字节
- 更安全,减少缓冲区溢出风险
2. Unicode作为规范性定义来源 ✅
变更: 使Unicode成为UTF-8的规范性定义来源,保留ISO/IEC 10646作为字符的参考。
说明:
RFC 2279: ISO/IEC 10646为主要参考
RFC 3629: Unicode标准为主要参考
ISO/IEC 10646为字符集参考
理由:
- Unicode提供更详细的UTF-8规范
- Unicode和ISO/IEC 10646保持同步
- Unicode提供更多实现细节
3. 术语规范化 ✅
变更: 理顺了术语。UTF-8现在以字符编号的编码形式来描述。UCS-2和UCS-4几乎消失。
术语对比:
| RFC 2279 | RFC 3629 | 说明 |
|---|---|---|
| UCS | Unicode/ISO 10646 | 更精确的引用 |
| UCS-2 | (很少提及) | 已过时 |
| UCS-4 | (很少提及) | 已过时 |
| 字符编号 | 码点/字符编号 | 术语统一 |
4. 强制禁止解码无效序列 ✅
变更: 将警告不要解码无效序列的注释转换为规范性的 MUST NOT。
关键变化:
RFC 2279: "注意: 建议不要解码无效序列..."
RFC 3629: "实现必须 (MUST) 防止解码无效序列"
影响: 从建议变为强制要求
安全原因:
- 防止过长编码攻击
- 防止安全绕过
- 参见第10章安全考虑
5. 新增BOM章节 ✅
变更: 添加了关于UTF-8 BOM的新章节,并为协议提供了建议。
新增内容:
- 第6章: Byte order mark (BOM)
- BOM的两种用途
- 协议中BOM使用的建议
- 何时应该/不应该使用BOM
关键建议:
- 纯UTF-8协议应禁止BOM
- 多编码环境可谨慎使用BOM
- 流开头以外的U+FEFF必须解释为零宽不换行空格
6. 移除UNICODE-1-1-UTF-8 ✅
变更: 移除了建议的UNICODE-1-1-UTF-8 MIME字符集注册。
原因:
- Unicode 1.1已过时
- "韩文混乱"问题已解决
- 版本无关的UTF-8标签更合适
7. 新增ABNF语法 ✅
变更: 添加了有效UTF-8八位字节序列的ABNF语法。
新增内容:
UTF8-octets = *( UTF8-char )
UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
UTF8-1 = %x00-7F
UTF8-2 = %xC2-DF UTF8-tail
UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
%xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
%xF4 %x80-8F 2( UTF8-tail )
UTF8-tail = %x80-BF
益处:
- 为实现者提供精确的语法
- 便于验证实现
- 明确禁止的字节值
8. 扩展安全考虑 ✅
变更: 扩展了安全考虑章节,特别是Unicode规范化的影响。
新增安全主题:
- 过长编码攻击的详细描述
- 实际攻击示例(2001年病毒)
- Unicode规范化问题
- 字符串匹配安全影响
参考:
- [UAX15] Unicode规范化形式
变更总结表
| 变更 | 类型 | 重要性 | 影响 |
|---|---|---|---|
| 限制到U+10FFFF | 技术 | ⭐⭐⭐⭐⭐ | 安全性提升 |
| Unicode为规范 | 规范性 | ⭐⭐⭐⭐ | 更清晰的标准 |
| 术语规范化 | 编辑 | ⭐⭐⭐ | 更好的理解 |
| MUST NOT无效序列 | 安全 | ⭐⭐⭐⭐⭐ | 强制安全 |
| BOM章节 | 新增 | ⭐⭐⭐⭐ | 协议指导 |
| ABNF语法 | 新增 | ⭐⭐⭐⭐ | 实现帮助 |
| 扩展安全 | 新增 | ⭐⭐⭐⭐⭐ | 安全意识 |
向后兼容性
兼容的变更
- 术语规范化
- BOM指导
- 安全建议扩展
不兼容的变更
- 字符范围限制: 5字节和6字节序列不再有效
- 实际影响: 几乎为零(这些字符从未在Unicode中定义)
- 益处: 提高安全性和互操作性
迁移建议
从RFC 2279迁移到RFC 3629
1. 检查代码
✓ 确保不生成5字节或6字节序列
✓ 确保拒绝超过U+10FFFF的字符
2. 验证逻辑
✓ 使用新的ABNF语法验证
✓ 添加过长编码检测
3. 安全审查
✓ 实施MUST NOT规则
✓ 考虑Unicode规范化
4. BOM处理
✓ 根据协议要求处理BOM
✓ 遵循第6章建议