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?


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



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

-6

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.