Gerçekten İyi, Kötü UTF-8 örnek test verileri [kapalı]


89

Bu yüzden, XSS filtrelememizi test etmek için XSS hile kağıdına sahibiz - ancak örnek bir iyi huylu sayfa dışında, UTF-8 kodumun hatalı davranan verileri işleyebildiğinden emin olmak için kötü veya hatalı biçimlendirilmiş test verileri bulamıyorum.

Test etmek için bazı iyi ve kötü verileri nerede bulabilirim? Ya da zor bir karakter dizisi nedir?




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

Yanıtlar:


99

1
Bunun için hiç çaba harcamamış olsanız da - o sayfa tam da aradığım şeydi. ;)
Xeoncross

76
Unutmayın, cevabı nerede bulacağınızı bilmek çoğu zaman cevabı bilmek kadar önemlidir.
Jonathan Leffler

19
Sizi uyarmak isterim ki testi, 17 ve üzeri düzlemler silinmeden önce 5 ve 6 bayt dizilerine izin verildiğinde eski bir UTF-8 tanımına dayanıyor. Ve U + FFFE ve U + FFFF kod noktalarının , Unicode konsorsiyumu başına olmadıklarında
Simon Kissane

36

Ayrıca bkz. Çince karakterler içeren bir dosya, karakter başına kaç bayt kullanılacağını nasıl bilir? - Hiç şüphe yok ki, yardımcı olabilecek başka SO soruları da var.

UTF-8'de aşağıdaki bayt türlerini alırsınız:

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

(Son satır, 0xF0..0xF7'yi okuması gerektiği gibi görünür; ancak, 21 bitlik Unicode aralığı (U + 0000 - U + 10FFFF), maksimum geçerli değerin 0xF4 olduğu; 0xF5..0xF7 değerlerinin geçerli UTF-8.)

Belirli bir bayt dizisinin geçerli UTF-8 olup olmadığına bakmak, şunları düşünmeniz gerektiği anlamına gelir:

  • Beklenmeyen yerlerde görünen devam baytları
  • Devam baytının beklendiği yerde görünen devam etmeyen baytlar
  • Dizenin sonunda eksik karakterler ('devam baytı bekleniyor' varyasyonu)
  • Minimal olmayan diziler
  • UTF-16 vekiller

Geçerli UTF-8'de, 0xF5..0xFF baytları oluşamaz.

Minimal olmayan diziler

Bazı karakterler için birden fazla olası temsil vardır. Örneğin, Unicode karakteri U + 0000 (ASCII NUL) şu şekilde temsil edilebilir:

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

Bununla birlikte, Unicode standardı, son üç alternatifin minimum olmadıkları için kabul edilemez olduğunu açıkça belirtir. Bu durumda, 0xC0 ve 0xC1 baytları hiçbir zaman geçerli UTF-8'de görünemez çünkü bunlar tarafından kodlanabilen karakterler yalnızca 0x00..0x7F aralığında tek baytlı karakterler olarak minimum düzeyde kodlanmıştır.

UTF-16 Suretleri

Temel Çok Dilli Düzlem (BMP) içinde, Unicode değerleri U + D800 - U + DFFF, UTF-16 yedekleri için ayrılmıştır ve geçerli UTF-8'de kodlanmış görünemez. UTF-8'de geçerli olsaydı (ki vurguluyorum, değildir), o zaman vekiller kodlanacaktı:

  • U + D800 - 0xED 0xA0 0x80 (en küçük yüksek vekil)
  • U + DBFF - 0xED 0xAF 0xBF (en büyük yüksek vekil)
  • U + DC00 - 0xED 0xB0 0x80 (en küçük düşük vekil)
  • U + DFFF - 0xED 0xBF 0xBF (en büyük düşük vekil)

Kötü Veri

Dolayısıyla, KÖTÜ verileriniz bu çeşitli reçeteleri ihlal eden örnekler içermelidir.

  • Başlangıç ​​bayt değerlerinden birinin önünde olmayan devam baytı
  • Çok karakterli ilk baytların ardından yeterli devam baytı gelmiyor
  • Minimal olmayan çok baytlı karakterler
  • UTF-16 vekiller
  • Geçersiz baytlar (0xC0, 0xC1, 0xF5..0xFF).

Bir bayt sırası işareti (BOM) U + FEFF, yani sıfır genişlikli bölünmez boşluk (ZWNBSP), UTF-8'de kodlanmamış görünemez - geçerli UTF-8'de 0xFF ve 0xFE baytlarına izin verilmez. Kodlanmış bir ZWNBSP, bir UTF-8 dosyasında 0xEF 0xBB 0xBF olarak görünebilir, ancak BOM UTF-8'de tamamen gereksizdir.


Bazıları da vardır noncharacters Unicode. U + FFFE ve U + FFFF bu tür iki karakter dışıdır (ve her düzlemdeki son iki kod noktası, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF diğerleri ). Bunlar normalde veri alışverişi için Unicode verilerinde görünmemelidir, ancak özel kullanımda görünebilir. Unicode'daki karakter olmayan karakterlerin oldukça karmaşık geçmişi de dahil olmak üzere birçok kötü ayrıntı için Unicode SSS bağlantısına bakın. ( Corrigendum # 9: Clarification About Noncharacters , Ocak 2013'te yayınlandı, başlığının önerdiği şeyi yapıyor - karakter olmayanların anlamını açıklıyor.)


Bu harika liste için teşekkürler. Şimdi bunların her birini daha ayrıntılı olarak incelemeyi planlıyorum.
Xeoncross

3
Karakter olmayan "UTF-8 kodlu verilerde görünmemesi gerektiği" yorumu yanıltıcıdır. Karakter olmayanlar , açık değişim için tasarlanmış UTF-8 kodlu verilerde görünmemelidir , ancak yine de UTF-8 kodlayıcılar / kod çözücüler tarafından kabul edilmelidir
Simon Kissane

@SimonKissane: Görünüşe göre, Ocak 2013'te yayınlanan status quo ante Corrigendum # 9 ile kafamı karıştıran birçok kişiden biriydim , öyle görünüyor. Unicode SSS'nin karakter olmayanlarla ilgili tüm bölümü okunmaya değer. Bilgi için teşekkürler. (Ayrıca yorumlarımın Unicode standardının söylediği ile uyuşan 'gerekir' dediğini de not edeceğim (ancak 'diyor' değil); amaç, 'açık değişim'de görünmemeleri, ancak' dahili kullanım için 'kullanılabilmeleridir. '.)
Jonathan Leffler

1
@AdrianMaire: Unicode (9.0.0) standardının 3. Bölümündeki tablo 3.6'ya bakın (sayfa numarası 125; PDF dosyasının p54'ü). Başka hangi kaynaklara danıştığınızdan emin değilim, ancak söylediklerimin bu tabloda yer aldığını düşünüyorum.
Jonathan Leffler

@JonathanLeffler% 100 haklısınız, referans için teşekkürler.
Adrian Maire

17

Herhangi bir metni gerçekten tuhaf bir UTF8 Homoglif dizisine dönüştürmek için Jeffrey Bergamini'nin bu kullanışlı çevrimiçi aracını kullanabilirsiniz .

Tipik

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

şöyle ol:

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


6
Sanırım bunun UTF8'i test etmeye gerçekten yardımcı olmamasıdır: vakaların tamamına yakın bir şey elde edemezsiniz, "kötü" durumlar yoktur ve format test için gerçekten yardımcı olmaz. Bu sadece tuhaf karakterler edinmenin bir yoludur.
Adrian Maire

Bunu denediniz mi? Bu jeneratör eğlence için değil. Size tam UTF-8 aralığından karakterler verir ve gerçek karakterlere garip bir şekilde benzedikleri için hangi karakterlerin size sorun çıkardığını 'görebilirsiniz'. Örneğin, iPhone'umun kutulu soru işareti olarak gösterdiği 6 karakter var.
Shebuka

4
IMO, bu harika araç bir açıklamaya çok güzel bir "katma değer" olabilirdi, ancak SO'da tek başına bir cevap olarak uymuyor (ayrıca sayfa devam etmeyebileceği için). Her neyse, açıklamasız bir -1'in çok yapıcı olmadığına katılıyorum.
Adrian Maire

Yani bu "iyi, iyi utf-8 örnek test verisi" ... ilişkili olduğu için olumlu oylamaya değer, IMO
Rondo


2

Kafamın üstünden:

0xff ve 0xfe

Tek yüksek bit bayt

Düşük baytlı karakterlerin çok baytlı gösterimi - Erken kontrollerden sonra boşları kaçırmanın iyi bir yolu

Bayt sırası işaretleri - Onları görmezden mi geleceksiniz?

NFC ve NFD

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.