真的很好,不好的UTF-8例子testing数据

因此,我们有XSS备忘单来testing我们的XSS过滤 – 但除了一个良性的例子页面,我找不到任何邪恶或畸形的testing数据,以确保我的UTF-8代码可以处理错过的数据。

我在哪里可以find一些不错的数据来testing? 或者什么是一个棘手的字符序列?

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

另请参见具有中文字符的文件如何知道每个字符使用多less个字节? – 毫无疑问,还有其他的SO问题也会有所帮助。

在UTF-8中,您可以获得以下types的字节:

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(U + 0000 – U + 10FFFF)的21位范围表示最大有效值为0xF4;值0xF5..0xF7不能出现在有效的UTF-8。)

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

  • 连续字节出现在预期的地方
  • 非连续字节出现在需要连续字节的地方
  • string末尾不完整的字符(“期望的延续字节”的变体)
  • 非最小序列
  • UTF-16替代品

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

非最小序列

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

 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(最大的低代理)

坏数据

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

  • 继续字节没有在其中一个初始字节值之前
  • 多字符的起始字节没有足够的连续字节
  • 非最小的多字节字符
  • UTF-16替代品
  • 无效字节(0xC0,0xC1,0xF5..0xFF)。

请注意,字节顺序标记(BOM)U + FEFF(也称为零宽度不中断空间(ZWNBSP))在UTF-8中不能出现未编码 – 在有效的UTF-8中不允许字节0xFF和0xFE。 一个编码的ZWNBSP可以在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中非复杂的非字符历史logging。 ( 更正#9: 2013年1月发布的“ 关于非字符的澄清”,其标题的含义是澄清非字符的含义。)

维基百科的UTF-8文章对哪些字节序列有效/无效做了很好的总结。 另一篇值得一读的文章是W3C I18N FAQ:多语言表单 。

您可以使用Jeffrey Bergamini提供的这个方便的在线工具来转换真正有线的UTF8 Homoglyphsstring中的任何文本。

一个典型的

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

变成这样:

</s>Ḽơᶉᶆᶆȋṕᶙṁᶙṁʂʂʂťӓṁʂ</s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s>ḑȋᵭṵḑȋᵭṵḑȋᵭṵḑȋᵭṵḑȋᵭṵḑȋᵭṵḑȋᵭṵḑȋᵭṵḑȋᵭṵḑȋᵭṵḑȋᵭṵ</s></s></s></s></s></s></s></s></s></s></s></s></s></s>ȶꝍꞎȶꝍꞎꝍꞎꝍꞎꝍꞎꝍꞎꝍꞎꝍꞎꝍꞎꝍꞎⱡⱡⱡⱡⱡ

closures我的头顶上:

0xff和0xfe

单个高位字节

低字节字符的多字节表示 – 通过早期检查走私零值的好方法

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

NFC与NFD