关于Unicode:非常好,不好的UTF-8示例测试数据

Really Good, Bad UTF-8 example test data

所以我们有XSS摘要来测试我们的XSS过滤——但是除了一个良性页面的例子之外,我找不到任何邪恶或畸形的测试数据来确保我的UTF-8代码可以处理错误的数据。

我在哪能找到好的,呃……要测试的错误数据?或者什么是复杂的字符序列?


查看Markus Kuhn的UTF-8解码器压力测试


另请参见一个包含中文字符的文件如何知道每个字符要使用多少字节?-毫无疑问,还有其他这样的问题也会有所帮助。

在UTF-8中,可以获得以下类型的字节:

1
2
3
4
5
6
Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation bytes (1-3 continuation bytes)
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF4   First byte of a 4-byte character encoding

(最后一行看起来应该是0xf0..0xf7;但是,Unicode的21位范围(U+0000-U+10ffff)意味着最大有效值是0xf4;值0xf5..0xf7不能出现在有效的UTF-8中。)

查看特定的字节序列是否是有效的UTF-8意味着您需要考虑:

  • 出现非预期的延续字节
  • 非连续字节出现在需要连续字节的位置
  • 字符串末尾的字符不完整(应为"continue byte"的变体)
  • 非最小序列
  • UTF-16代理

在有效的UTF-8中,不能出现字节0xf5..0xff。

非最小序列

某些字符有多种可能的表示形式。例如,Unicode字符U+0000(ASCII NUL)可以表示为:

1
2
3
4
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80

但是,Unicode标准明确指出,最后三个选项是不可接受的,因为它们不是最小的。因此,字节0xc0和0xc1永远不会出现在有效的utf-8中,因为可以由这些字符编码的唯一字符在0x00..0x7f范围内最小程度地编码为单字节字符。

UTF-16代理

在基本多语言平面(BMP)中,Unicode值U+D800-U+DFFF是为UTF-16代理保留的,不能以有效的UTF-8编码。如果它们在UTF-8中是有效的(我强调,它们不是有效的),那么代理将被编码:

  • U+D800-0XED 0XA0 0X80(最小高代理)
  • U+DBFF-0XED 0XAF 0XBF(最大高代理)
  • U+DC00-0XED 0XB0 0X80(最小低代理)
  • U+DFFF-0XED 0XBF 0XBF(最大低代理)

不良数据

所以,您的坏数据应该包含违反这些不同处方的样本。

  • 连续字节前面没有一个初始字节值
  • 多字符初始字节后面没有足够的连续字节
  • 非最小多字节字符
  • UTF-16代理
  • 无效字节(0xc0、0xc1、0xf5..0xff)。

请注意,字节顺序标记(bom)u+feff,也称为零宽度不间断空格(zwnbsp),不能以utf-8的形式未编码-字节0xff和0xfe在有效的utf-8中不允许出现。编码后的zwnbp可以在utf-8文件中显示为0xef 0xbb 0xbf,但在utf-8中,BOM完全是多余的。

还有一些Unicode中的非字符。u+fffe和u+ffff是两个这样的非特征(每个平面中的最后两个代码点,u+1fffe、u+1ffff、u+2fffe、u+2ffff,……U+10fffe,U+10ffff是其他)。这些通常不应该出现在用于数据交换的Unicode数据中,但可以出现在私用中。请参阅unicode常见问题链接了解许多肮脏的细节,包括unicode中非字符的复杂历史。(更正9:2013年1月发布的关于非字符的澄清,其标题表明了非字符的含义。)


您可以使用JeffreyBergamini提供的这个方便的在线工具将任何文本转换成一个非常奇怪的utf8字符串。

典型

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua.

变成这样:

< Buff行情>

????????????????????????????????????????????????????????????????????????????????????????????????????????????????????艾美??????????????????????<;/>;<;/blockquotn


维基百科的UTF-8文章对哪些字节序列有效/无效进行了很好的总结。另一篇值得阅读的文章是W3CI18N常见问题解答:多语言表单。


在我的头顶上:

0xFF和0xFE

单个高位字节

低字节字符的多字节表示法-通过早期检查偷运空船的好方法

字节顺序标记-你会忽略它们吗?

NFC与NFD