Sangat Baik, Data pengujian contoh UTF-8 Buruk [ditutup]


89

Jadi kami memiliki lembar contekan XSS untuk menguji pemfilteran XSS kami - tetapi selain contoh halaman jinak, saya tidak dapat menemukan data pengujian yang jahat atau cacat untuk memastikan bahwa kode UTF-8 saya dapat menangani data yang tidak berfungsi dengan baik.

Di mana saya dapat menemukan beberapa data yang baik uh .. buruk untuk diuji? Atau apakah urutan karakter yang rumit itu?


4
columbia.edu/kermit/utf8.html adalah satu lagi yang bagus
Xeoncross


15
ăѣ𝔠 ծ ềſģȟ Ꭵ𝒋 ǩľḿꞑȯ𝘱𝑞𝗋𝘴ȶ𝞄𝜈ψ𝒙𝘆𝚣1234567890! @ # $% ^ & * () -_ = + [{]} ;: '", <.> /? ~𝘈Ḇ𝖢𝕯٤ḞԍНǏ𝙅ƘԸⲘ𝙉০Ρ𝗤Ɍ𝓢ȚЦ𝒱Ѡ𝓧ƳȤѧᖯć𝗱ễ𝑓𝙜Ⴙ𝞲𝑗𝒌ļṃʼnо𝞎𝒒ᵲꜱ𝙩ừ𝗏ŵ𝒙𝒚ź1234567890!@#$%^&*()-_=+[{]};:'",<.>/?~ АḂ Ⲥ𝗗𝖤𝗙 ꞠꓧȊ𝐉𝜥ꓡ𝑀𝑵Ǭ𝙿𝑄Ŗ𝑆𝒯𝖴𝘝𝘞ꓫŸ𝜡ả𝘢ƀ𝖼ḋếᵮℊ𝙝 Ꭵ𝕛 кιṃ դ ⱺ𝓅𝘲𝕣𝖘ŧ𝑢ṽẉ𝘅 ყ ž1234567890! @ # $% ^ & * () -_ = + [{]}; : '", <.> /? ~Ѧ𝙱ƇᗞΣℱԍҤ١𝔍К𝓛𝓜ƝȎ𝚸𝑄Ṛ𝓢ṮṺƲᏔꓫ𝚈𝚭𝜶Ꮟçძ𝑒𝖿𝗀ḧ𝗂𝐣ҝɭḿ𝕟𝐨𝝔𝕢ṛ𝓼тú𝔳ẃ⤬𝝲𝗓1234567890!@#$%^&*()-_=+[{]};:'",<.>/?~ 𝖠Β𝒞𝘋𝙴𝓕ĢȞỈ𝕵ꓗʟ𝙼ℕ০𝚸𝗤 Հꓢ ṰǓⅤ𝔚 Ⲭ𝑌𝙕𝘢𝕤
Andrew

Jawaban:


99

1
Meskipun Anda tidak berusaha melakukan ini - halaman itu adalah yang saya cari. ;)
Xeoncross

76
Jangan lupa, mengetahui di mana menemukan jawabannya seringkali sama pentingnya dengan mengetahui jawabannya.
Jonathan Leffler

19
Saya akan memperingatkan Anda bahwa pengujiannya didasarkan pada definisi UTF-8 yang sudah ketinggalan zaman, ketika urutan 5 dan 6 byte diizinkan, sebelum pesawat 17 ke atas dihapus. Dan ini menyiratkan bahwa titik kode U + FFFE dan U + FFFF tidak valid di UTF-8, jika menurut konsorsium Unicode
Simon Kissane

36

Lihat juga Bagaimana file dengan karakter Cina mengetahui berapa banyak byte yang digunakan per karakter? - tidak diragukan lagi, ada pertanyaan SO lain yang juga akan membantu.

Dalam UTF-8, Anda mendapatkan jenis byte berikut:

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

(Baris terakhir terlihat seolah-olah membaca 0xF0..0xF7; namun, kisaran 21-bit Unicode (U + 0000 - U + 10FFFF) berarti bahwa nilai valid maksimum adalah 0xF4; nilai 0xF5..0xF7 tidak dapat terjadi di UTF-8 yang valid.)

Melihat apakah urutan byte tertentu adalah UTF-8 yang valid berarti Anda perlu memikirkan tentang:

  • Byte kelanjutan muncul di tempat yang tidak diharapkan
  • Byte non-lanjutan muncul di tempat yang diharapkan byte lanjutan
  • Karakter tidak lengkap di akhir string (variasi 'byte lanjutan diharapkan')
  • Urutan non-minimal
  • Pengganti UTF-16

Dalam UTF-8 yang valid, byte 0xF5..0xFF tidak dapat terjadi.

Urutan non-minimal

Ada beberapa kemungkinan representasi untuk beberapa karakter. Misalnya, karakter Unicode U + 0000 (ASCII NUL) dapat diwakili oleh:

0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80

Namun, standar Unicode dengan jelas menyatakan bahwa tiga alternatif terakhir tidak dapat diterima karena tidak minimal. Kebetulan byte 0xC0 dan 0xC1 tidak pernah dapat muncul dalam UTF-8 yang valid karena satu-satunya karakter yang dapat dikodekan olehnya minimal dikodekan sebagai karakter byte tunggal dalam kisaran 0x00..0x7F.

Pengganti UTF-16

Dalam Basic Multi-lingual Plane (BMP), nilai Unicode U + D800 - U + DFFF dicadangkan untuk pengganti UTF-16 dan tidak dapat muncul dikodekan dalam UTF-8 yang valid. Jika mereka valid dalam UTF-8 (yang, saya tekankan, mereka tidak valid), maka pengganti akan dikodekan:

  • U + D800 - 0xED 0xA0 0x80 (pengganti tinggi terkecil)
  • U + DBFF - 0xED 0xAF 0xBF (pengganti tinggi terbesar)
  • U + DC00 - 0xED 0xB0 0x80 (pengganti rendah terkecil)
  • U + DFFF - 0xED 0xBF 0xBF (pengganti rendah terbesar)

Data Buruk

Jadi, data BAD Anda harus berisi contoh yang melanggar berbagai resep ini.

  • Byte lanjutan tidak diawali dengan salah satu nilai byte awal
  • Byte awal multi-karakter tidak diikuti oleh byte lanjutan yang cukup
  • Karakter multi-byte non-minimal
  • Pengganti UTF-16
  • Byte tidak valid (0xC0, 0xC1, 0xF5..0xFF).

Perhatikan bahwa byte-order mark (BOM) U + FEFF, alias zero-width no-break space (ZWNBSP), tidak dapat muncul tanpa kode dalam UTF-8 - byte 0xFF dan 0xFE tidak diizinkan dalam UTF-8 yang valid. ZWNBSP yang dienkode dapat muncul dalam file UTF-8 sebagai 0xEF 0xBB 0xBF, tetapi BOM benar-benar berlebihan dalam UTF-8.


Ada juga beberapa nonkarakter di Unicode. U + FFFE dan U + FFFF adalah dua karakter nonkarakter (dan dua titik kode terakhir di setiap bidang, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF adalah lainnya ). Ini biasanya tidak muncul dalam data Unicode untuk pertukaran data, tetapi dapat muncul untuk penggunaan pribadi. Lihat tautan FAQ Unicode untuk banyak detail kotor, termasuk riwayat nonkarakter yang agak rumit di Unicode. ( Corrigendum # 9: Clarification About Noncharacters , yang dirilis pada Januari 2013, melakukan apa yang disarankan oleh judulnya - menjelaskan arti non-karakter.)


Terima kasih untuk daftar hebat ini. Saya berencana untuk memeriksa masing-masing ini lebih detail sekarang.
Xeoncross

3
Komentar bahwa non-karakter "tidak boleh muncul dalam data berenkode UTF-8" menyesatkan. Non-karakter tidak boleh muncul dalam data berenkode UTF-8 yang dimaksudkan untuk pertukaran terbuka , tetapi harus diterima oleh pembuat enkode / dekoder UTF-8
Simon Kissane

@SimonKissane: Ternyata saya salah satu dari sekian banyak yang bingung dengan status quo ante Corrigendum # 9 yang rilis pada Januari 2013 sepertinya. Seluruh bagian dari FAQ Unicode tentang nonkarakter layak untuk dibaca. Terimakasih atas infonya. (Saya juga akan mencatat bahwa komentar saya mengatakan 'harus' yang sesuai dengan apa yang dikatakan standar Unicode (tetapi tidak 'mengatakan'); maksudnya adalah bahwa mereka tidak boleh muncul dalam 'pertukaran terbuka' tetapi dapat digunakan untuk 'penggunaan internal '.)
Jonathan Leffler

1
@AdrianMaire: Lihat tabel 3.6 di Bab 3 dari standar Unicode (9.0.0) (nomor halaman 125; p54 dari file PDF). Saya tidak yakin sumber lain mana yang Anda tanyakan, tetapi saya pikir apa yang saya katakan tercakup dalam tabel itu.
Jonathan Leffler

@JonathanLeffler Anda 100% benar, Terima kasih atas referensi Anda.
Adrian Maire

17

Anda dapat menggunakan alat online praktis dari Jeffrey Bergamini ini untuk mengubah teks apa pun menjadi string UTF8 Homoglyph yang sangat aneh.

Sebuah tipikal

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

menjadi seperti ini:

Ḽơᶉëᶆ ȋṕšᶙṁ ḍỡḽǭᵳ ʂǐť ӓṁệẗ, ĉṓɲṩḙċťᶒțûɾ ấɖḯƥĭṩčįɳġ ḝłįʈ, șếᶑ ᶁⱺ ẽḭŭŝḿꝋď ṫĕᶆᶈṓɍ ỉñḉīḑȋᵭṵńť ṷŧ ḹẩḇőꝛế éȶ đꝍꞎôꝛȇ ᵯáꞡᶇā ąⱡîɋṹẵ.


6
Saya kira itu karena ini tidak benar-benar membantu untuk menguji UTF8: Anda tidak mendapatkan apa pun yang mendekati kasus lengkap, tidak ada kasus yang "buruk" dan formatnya tidak terlalu membantu untuk pengujian. Itu hanya cara untuk mendapatkan karakter aneh.
Adrian Maire

Apakah kamu sudah mencobanya Generator itu bukan untuk bersenang-senang. Ini memberi Anda karakter dari rentang UTF-8 penuh, dan karena mereka sangat mirip dengan karakter sebenarnya, Anda dapat 'melihat' karakter apa yang memberi Anda masalah. Sebagai contoh saya telah memposting ada 6 karakter yang iPhone saya render sebagai tanda tanya kotak.
Shebuka

4
IMO, alat yang luar biasa ini bisa menjadi "Nilai tambah" yang sangat bagus untuk sebuah penjelasan, tetapi tidak cocok sebagai jawaban dengan sendirinya di SO (juga karena halaman tersebut dapat dihentikan). Bagaimanapun, saya setuju bahwa -1 tanpa penjelasan tidak terlalu konstruktif.
Adrian Maire

Jadi ini adalah "data uji contoh utf-8 yang bagus, bagus" ... layak mendapat suara positif karena terkait, IMO
Rondo


2

Dari atas kepala saya:

0xff dan 0xfe

Satu byte bit tinggi

Representasi multi-byte dari karakter byte rendah - Cara yang baik untuk menyelundupkan null setelah pemeriksaan awal

Tanda urutan byte - Apakah Anda akan mengabaikannya?

NFC vs. NFD

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.