Naprawdę dobre, złe przykładowe dane testowe UTF-8 [zamknięte]

88

Mamy więc ściągawkę XSS do testowania naszego filtrowania XSS - ale poza przykładową niegroźną stroną nie mogę znaleźć żadnych złych lub źle sformułowanych danych testowych, aby upewnić się, że mój kod UTF-8 poradzi sobie z nieprawidłowo działającymi danymi.

Gdzie mogę znaleźć dobre ... złe dane do przetestowania? Albo co to jest skomplikowana sekwencja znaków?

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

Odpowiedzi:

98

Sprawdź test obciążeniowy dekodera UTF-8 Markusa Kuhna

zildjohn01
źródło
1
Chociaż nie włożyłeś w to żadnego wysiłku - ta strona jest właśnie tym, czego szukałem. ;)
Xeoncross
75
Nie zapominaj, że wiedza, gdzie znaleźć odpowiedź, jest często tak samo ważna, jak znajomość odpowiedzi.
Jonathan Leffler,
19
Ostrzegam, że jego test opiera się na przestarzałej definicji UTF-8, kiedy dozwolone były sekwencje 5 i 6 bajtowe, zanim płaszczyzny 17 i nowsze zostały usunięte. Oznacza to, że punkty kodowe U + FFFE i U + FFFF są nieważne w UTF-8, podczas gdy w konsorcjum Unicode nie są
Simon Kissane
35

Zobacz także Skąd plik zawierający znaki chińskie wie, ile bajtów użyć na znak? - bez wątpienia są inne pytania SO, które również by pomogły.

W UTF-8 otrzymujesz następujące typy bajtów:

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

(Ostatnia linia wygląda tak, jakby miała czytać 0xF0..0xF7; jednak 21-bitowy zakres Unicode (U + 0000 - U + 10FFFF) oznacza, że ​​maksymalna poprawna wartość to 0xF4; wartości 0xF5..0xF7 nie mogą wystąpić w ważny UTF-8.)

Sprawdzanie, czy dana sekwencja bajtów jest prawidłowa UTF-8 oznacza, że ​​musisz pomyśleć o:

  • Bajty kontynuacyjne pojawiają się tam, gdzie nie są oczekiwane
  • Bajty bez kontynuacji pojawiają się tam, gdzie oczekiwany jest bajt kontynuacji
  • Niekompletne znaki na końcu ciągu (odmiana „oczekiwano bajtu kontynuacji”)
  • Sekwencje nie-minimalne
  • Surogaty UTF-16

W prawidłowym UTF-8 bajty 0xF5..0xFF nie mogą wystąpić.

Sekwencje nie-minimalne

Istnieje wiele możliwych reprezentacji niektórych postaci. Na przykład znak Unicode U + 0000 (ASCII NUL) może być reprezentowany przez:

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

Jednak standard Unicode wyraźnie stwierdza, że ​​ostatnie trzy alternatywy są niedopuszczalne, ponieważ nie są minimalne. Tak się składa, że ​​bajty 0xC0 i 0xC1 nigdy nie mogą pojawić się w prawidłowym UTF-8, ponieważ jedyne znaki, które mogą być przez nie zakodowane, są minimalnie zakodowane jako znaki jednobajtowe z zakresu 0x00..0x7F.

Surogaty UTF-16

W Basic Multi-Lingual Plane (BMP) wartości Unicode U + D800 - U + DFFF są zarezerwowane dla surogatów UTF-16 i nie mogą pojawić się zakodowane w prawidłowym UTF-8. Gdyby były ważne w UTF-8 (co, podkreślam, nie są), to surogaty byłyby kodowane:

  • U + D800 - 0xED 0xA0 0x80 (najmniejszy wysoki surogat)
  • U + DBFF - 0xED 0xAF 0xBF (największy wysoki surogat)
  • U + DC00 - 0xED 0xB0 0x80 (najmniejszy niski surogat)
  • U + DFFF - 0xED 0xBF 0xBF (największy niski surogat)

Złe dane

Twoje dane BAD powinny więc zawierać próbki naruszające te różne zalecenia.

  • Bajt kontynuacji nie jest poprzedzony żadną z początkowych wartości bajtu
  • Wieloznakowe bajty początkowe zabrakło wystarczającej liczby bajtów kontynuacji
  • Inne niż minimalne znaki wielobajtowe
  • Surogaty UTF-16
  • Nieprawidłowe bajty (0xC0, 0xC1, 0xF5..0xFF).

Należy zauważyć, że znacznik kolejności bajtów (BOM) U + FEFF, inaczej spacja bez przerwy o zerowej szerokości (ZWNBSP), nie może pojawić się jako niezakodowany w UTF-8 - bajty 0xFF i 0xFE nie są dozwolone w prawidłowym UTF-8. Zakodowany ZWNBSP może pojawić się w pliku UTF-8 jako 0xEF 0xBB 0xBF, ale BOM jest całkowicie zbędny w UTF-8.


W Unicode jest również kilka znaków niebędących znakami . U + FFFE i U + FFFF to dwa takie nie-znaki (a ostatnie dwa punkty kodowe w każdej płaszczyźnie, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF to inne ). Nie powinny one normalnie pojawiać się w danych Unicode do wymiany danych, ale mogą pojawiać się do użytku prywatnego. Zobacz link do często zadawanych pytań na temat Unicode, aby uzyskać wiele obskurnych szczegółów, w tym dość złożoną historię znaków niebędących znakami w Unicode. ( Sprostowanie nr 9: Wyjaśnienie dotyczące znaków niebędących postaciami , które zostało wydane w styczniu 2013 r., Robi to, co sugeruje jego tytuł - wyjaśnia znaczenie niebędących postaciami.)

Jonathan Leffler
źródło
Dzięki za tę świetną listę. Planuję teraz dokładniej sprawdzić każdy z nich.
Xeoncross
3
Uwaga, że ​​znaki niebędące znakami „nie powinny pojawiać się w danych zakodowanych w UTF-8” jest myląca. Znaki nie powinny pojawiać się w danych zakodowanych w UTF-8 przeznaczonych do otwartej wymiany , ale mimo to powinny być akceptowane przez kodery / dekodery UTF-8
Simon Kissane
@SimonKissane: Najwyraźniej byłem jednym z wielu zdezorientowanych status quo ante Corrigendum # 9 , które zostało wydane w styczniu 2013 roku. Warto przeczytać całą sekcję FAQ Unicode na temat znaków niebędących znakami . Dzięki za informację. (Zwrócę również uwagę, że moje komentarze mówią „powinien”, co jest zgodne z tym, co powiedział standard Unicode (ale nie „mówi”); intencją jest, aby nie pojawiały się w „otwartej wymianie”, ale mogły być użyte do „użytku wewnętrznego '.)
Jonathan Leffler
1
@AdrianMaire: patrz tabela 3.6 w rozdziale 3 standardu Unicode (9.0.0) (strona 125; strona 54 pliku PDF). Nie jestem pewien, z którymi innymi źródłami się konsultujesz, ale myślę, że to, co powiedziałem, znajduje się w tej tabeli.
Jonathan Leffler
@JonathanLeffler Masz 100% racji, dziękuję za odniesienie.
Adrian Maire
17

Możesz skorzystać z tego poręcznego narzędzia online autorstwa Jeffreya Bergaminiego autorstwa aby przekonwertować dowolny tekst na naprawdę dziwny ciąg homoglifów UTF8.

Typowy

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

stać się takim:

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

Shebuka
źródło
6
Przypuszczam, że dzieje się tak dlatego, że nie pomaga to w testowaniu UTF8: nie uzyskuje się niczego zbliżonego do pełnego zestawu przypadków, nie ma „złych” przypadków, a format nie jest zbyt pomocny w testowaniu. To tylko sposób na zdobycie dziwnych postaci.
Adrian Maire
Próbowałeś tego? Ten generator nie jest dla zabawy. Daje ci znaki z pełnego zakresu UTF-8, a ponieważ są one dziwnie podobne do rzeczywistych znaków, możesz „zobaczyć”, jakie znaki powodują problemy. W przykładzie, który opublikowałem, jest 6 znaków, które mój iPhone renderuje jako znaki zapytania w ramce.
Shebuka
4
IMO, to wspaniałe narzędzie mogło być bardzo miłą "wartością dodaną" do wyjaśnienia, ale samo w sobie nie pasuje jako odpowiedź w SO (również dlatego, że strona może zostać wycofana). W każdym razie zgadzam się, że -1 bez wyjaśnienia nie jest zbyt konstruktywne.
Adrian Maire
To są „dobre, dobre przykładowe dane testowe utf-8” ... warte uwagi, ponieważ dotyczyły, IMO
Rondo,
2

Z czubka mojej głowy:

0xff i 0xfe

Pojedyncze bajty wysokobitowe

Wielobajtowa reprezentacja znaków małobajtowych - dobry sposób na przemycanie wartości zerowych poza wczesne sprawdzenia

Znaczniki kolejności bajtów - czy zamierzasz je zignorować?

NFC a NFD

Douglas Leeder
źródło