Contoh string utf8 tidak valid?

96

Saya menguji bagaimana beberapa kode saya menangani data yang buruk, dan saya memerlukan beberapa seri byte yang UTF-8 tidak valid.

Bisakah Anda memposting beberapa, dan idealnya, penjelasan mengapa itu buruk / di mana Anda mendapatkannya?

twk
sumber
4
Kemungkinan duplikat data uji contoh UTF-8 Sangat Baik, Buruk
Claudiu

Jawaban:

51

Dalam PHP:

$examples = array(
    'Valid ASCII' => "a",
    'Valid 2 Octet Sequence' => "\xc3\xb1",
    'Invalid 2 Octet Sequence' => "\xc3\x28",
    'Invalid Sequence Identifier' => "\xa0\xa1",
    'Valid 3 Octet Sequence' => "\xe2\x82\xa1",
    'Invalid 3 Octet Sequence (in 2nd Octet)' => "\xe2\x28\xa1",
    'Invalid 3 Octet Sequence (in 3rd Octet)' => "\xe2\x82\x28",
    'Valid 4 Octet Sequence' => "\xf0\x90\x8c\xbc",
    'Invalid 4 Octet Sequence (in 2nd Octet)' => "\xf0\x28\x8c\xbc",
    'Invalid 4 Octet Sequence (in 3rd Octet)' => "\xf0\x90\x28\xbc",
    'Invalid 4 Octet Sequence (in 4th Octet)' => "\xf0\x28\x8c\x28",
    'Valid 5 Octet Sequence (but not Unicode!)' => "\xf8\xa1\xa1\xa1\xa1",
    'Valid 6 Octet Sequence (but not Unicode!)' => "\xfc\xa1\xa1\xa1\xa1\xa1",
);

Dari http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php#54805

philfreo.dll
sumber
4

, ̆ sangat jahat. Saya melihatnya sebagai gabungan di ubuntu.

tanda koma

pengguna1015281
sumber
3

Ide pola urutan byte yang tidak terbentuk dengan baik dapat diperoleh dari tabel urutan byte yang terbentuk dengan baik. Lihat " Tabel 3-7. Urutan Byte UTF-8 yang Berformat Baik " di Unicode Standard 6.2.

    Code Points    First Byte Second Byte Third Byte Fourth Byte
  U+0000 -   U+007F   00 - 7F
  U+0080 -   U+07FF   C2 - DF    80 - BF
  U+0800 -   U+0FFF   E0         A0 - BF     80 - BF
  U+1000 -   U+CFFF   E1 - EC    80 - BF     80 - BF
  U+D000 -   U+D7FF   ED         80 - 9F     80 - BF
  U+E000 -   U+FFFF   EE - EF    80 - BF     80 - BF
 U+10000 -  U+3FFFF   F0         90 - BF     80 - BF    80 - BF
 U+40000 -  U+FFFFF   F1 - F3    80 - BF     80 - BF    80 - BF
U+100000 - U+10FFFF   F4         80 - 8F     80 - BF    80 - BF

Berikut adalah contoh yang dihasilkan dari U + 24B62. Saya menggunakannya untuk laporan bug: Bug # 65045 mb_convert_encoding merusak karakter yang terbentuk dengan baik

// U+24B62: "\xF0\xA4\xAD\xA2"
"\xF0\xA4\xAD"    ."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"
"\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD"

Penyederhanaan rentang byte tambahan ([0x80, 0xBF]) dapat dilihat di berbagai pustaka.

// U+0800 - U+0FFF
\xE0\x80\x80

// U+D000 - U+D7FF
\xED\xBF\xBF

// U+10000 -  U+3FFFF
\xF0\x80\x80\x80

// U+100000 - U+10FFFF
\xF4\xBF\xBF\xBF
masakielastik
sumber
-6

Fuzz Testing - menghasilkan urutan oktet acak. Kemungkinan besar Anda akan mendapatkan beberapa urutan ilegal lebih cepat daripada nanti.

shoosh
sumber
7
Tidak ada yang lebih buruk daripada memiliki heisenbugs atau eisentests. Tes lulus 10 kali, Anda merilis produk, tes gagal.
Eric Duminil
@EricDuminil pernah mendengar tentang srand ()?
shoosh
4
Cukup adil. Bisakah Anda menyebutkannya dalam jawaban agar saya dapat mengembalikan suara negatif saya?
Eric Duminil
2
Ah ah. Nah, selalu ada hal baru untuk dipelajari, itulah mengapa saya datang ke SO. Saya pikir srand()saran Anda adalah ide yang bagus, mungkin membantu orang lain di sini.
Eric Duminil
Kita dapat membuat string yang tidak valid secara langsung, kita tidak perlu keacakan untuk mencoba dan akhirnya menemukannya, meskipun pustaka pemrosesan string (mungkin!) Akan mendapat manfaat dari fuzzing untuk berjaga-jaga.
galva