Skip to main content

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 2279RFC 3629说明
UCSUnicode/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章建议

相关链接