真的很好,坏的UTF-8示例测试数据

时间:2009-08-23 17:06:10

标签: unicode utf-8

所以我们有XSS cheat sheet来测试我们的XSS过滤 - 但除example benign page之外我找不到任何邪恶或格式错误的测试数据,以确保我的UTF-8代码可以处理行为错误数据

我在哪里可以找到一些好的...用于测试的不良数据?或者什么是一个棘手的字符序列?

5 个答案:

答案 0 :(得分:88)

答案 1 :(得分:33)

另见How does a file with Chinese characters know how many bytes to use per character? - 毫无疑问,还有其他SO问题也会有所帮助。

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

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;但是,21位的Unicode范围(U + 0000 - U + 10FFFF)意味着最大有效值为0xF4;值为0xF5..0xF7不能出现在有效的UTF-8中。)

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

  • 在不期望的地方出现连续字节
  • 出现连续字节的非连续字节
  • 字符串末尾的字符不完整(预期的连续字节的变化)
  • 非最小序列
  • UTF-16代理人

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

非最小序列

某些字符有多种可能的表示形式。例如,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可以作为0xEF 0xBB 0xBF出现在UTF-8文件中,但是在UTF-8中BOM完全是多余的。


Unicode中也有一些noncharacters。 U + FFFE和U + FFFF是两个这样的非字符(每个平面中的最后两个代码点,U + 1FFFE,U + 1FFFF,U + 2FFFE,U + 2FFFF,... U + 10FFFE,U + 10FFFF等等)。这些通常不应出现在用于数据交换的Unicode数据中,但可以出现在私人使用中。有关许多sordid详细信息,请参阅Unicode FAQ链接,包括Unicode中非字符的相当复杂的历史记录。 (Corrigendum #9: Clarification About Noncharacters,于2013年1月发布,执行其标题建议 - 澄清非字符的含义。)

答案 2 :(得分:12)

您可以使用this handy online tool from Jeffrey Bergamini将任何文本转换为非常奇怪的UTF8 Homoglyphs字符串。

典型的

  

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

变成这样:

  

Ḽơᶉëᶆᶆšᶙṁᶙṁḍỡḽǭᵳǐťť,ĉṓɲṩḙċťᶒţûɾɾčįɳġįɳġłįʈ,şếᶑᶑ   ẽḭŭŝḿꝋďṫĕᶆᶈṓɍỉñḉīḑȋᵭṵḑȋᵭṵťťṷŧḹẩḇꝛꝛȶȶȶȶ<。

答案 3 :(得分:5)

Wikipedia’s UTF-8 article很好地总结了哪些字节序列有效/无效。另一篇值得阅读的文章是W3C I18N FAQ: Multilingual Forms

答案 4 :(得分:2)

脱离我的头顶:

0xff和0xfe

单个高位字节

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

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

NFC vs. NFD