97

所以我们有XSS 备忘单来测试我们的 XSS 过滤 - 但除了示例良性页面之外,我找不到任何邪恶或格式错误的测试数据,以确保我的 UTF-8 代码可以处理行为不端的数据。

我在哪里可以找到一些好的呃..坏数据来测试?或者什么是棘手的字符序列?

4

5 回答 5

104

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

于 2009-08-23T19:33:16.550 回答
38

另请参阅带有中文字符的文件如何知道每个字符使用多少字节?— 毫无疑问,还有其他一些 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;但是,Unicode 的 21 位范围(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 中出现未编码的情况——字节 0xFF 和 0xFE 在有效的 UTF-8 中是不允许的。编码的 ZWNBSP 在 UTF-8 文件中可以显示为 0xEF 0xBB 0xBF,但 BOM 在 UTF-8 中完全是多余的。


Unicode中也有一些字符。U+FFFE 和 U+FFFF 是两个这样的非字符(每个平面中的最后两个代码点,U+1FFFE、U+1FFFF、U+2FFFE、U+2FFFF、... U+10FFFE、U+10FFFF 是其他的)。这些通常不应出现在用于数据交换的 Unicode 数据中,但可以出现在私人使用中。请参阅 Unicode FAQ 链接了解许多肮脏的细节,包括 Unicode 中相当复杂的非字符历史。(勘误#9:关于非字符的澄清,于 2013 年 1 月发布,正如其标题所暗示的那样——澄清了非字符的含义。)

于 2009-08-23T18:39:05.100 回答
17

您可以使用Jeffrey Bergamini提供的这个方便的在线工具将任何文本转换为非常奇怪的 UTF8 同形文字字符串。

一个典型的

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

变成这样:

ḽơᶉëᶆḽơᶉëᶆšᶙṁᶙṁʂǐťʂǐť,ĉṓɲṩḙċťᶒţûɾĉṓɲṩḙċťᶒţûɾčįɳġįɳġłįʈ,ếᶑếᶑếᶑᶁⱺẽḭŭŝḿꝋďṫĕᶆᶈṓɍñḉīḑȋᵭṵńťḉīḑȋᵭṵńťṷŧḹẩḇőꝛếḹẩḇőꝛếȶđꝍꞎꝛȇáꞡᶇꞡᶇąⱡᵯᵯᵯᵯᵯᵯᵯᵯᵯᵯᵯɋṹẵ

于 2016-12-15T15:08:17.097 回答
4

Wikipedia 的 UTF-8 文章很好地总结了哪些字节序列是有效/无效的。另一篇值得一读的文章是W3C I18N 常见问题解答:多语言表单

于 2009-08-23T17:09:07.420 回答
2

在我的头顶上:

0xff 和 0xfe

单个高位字节

低字节字符的多字节表示 - 一种通过早期检查走私空值的好方法

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

NFC 与 NFD

于 2009-08-23T17:22:16.940 回答