Дійсно добре, погано UTF-8 приклади даних тесту [закрито]


88

Отже, у нас є шпаргалка XSS для тестування нашої фільтрації XSS - але крім прикладу доброякісної сторінки, я не можу знайти жодних злих чи неправильно сформованих даних тесту, щоб переконатися, що мій код UTF-8 може обробляти дані, що не відповідають дійсності.

Де я можу знайти хороші е .. погані дані для тестування? Або яка хитра послідовність символів?


4
columbia.edu/kermit/utf8.html ще один хороший
Xeoncross


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

Відповіді:


98

1
Хоча ви до цього не доклали жодних зусиль - ця сторінка - саме те, що я шукав. ;)
Xeoncross

75
Не забувайте, що знати, де знайти відповідь, часто так само важливо, як і знати відповідь.
Джонатан Леффлер,

19
Я попереджую вас, що його тест базується на застарілому визначенні UTF-8, коли були дозволені послідовності 5 і 6 байт, перш ніж площини 17 і вище були видалені. І це означає, що кодові точки U + FFFE та U + FFFF є недійсними в UTF-8, коли для консорціуму Unicode вони не є
Саймон Кіссан

34

Дивіться також Як файл з китайськими символами знає, скільки байтів використовувати на символ? - без сумніву, є й інші запитання щодо ТО, які також могли б допомогти.

В UTF-8 ви отримуєте такі типи байтів:

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

(Останній рядок виглядає так, ніби він повинен читати 0xF0..0xF7; однак, 21-бітний діапазон Unicode (U + 0000 - U + 10FFFF) означає, що максимально допустимим значенням є 0xF4; значення 0xF5..0xF7 не можуть дійсний UTF-8.)

Перевірка того, чи відповідає певна послідовність байтів UTF-8, означає, що вам потрібно подумати про:

  • Байти продовження, що з’являються там, де не передбачається
  • Байти без продовження, що з’являються там, де очікується байт продовження
  • Неповні символи в кінці рядка (варіація "очікується байт продовження")
  • Не мінімальні послідовності
  • Сурогати UTF-16

У дійсній UTF-8 байти 0xF5..0xFF не можуть відбуватися.

Не мінімальні послідовності

Існує декілька можливих зображень для деяких символів. Наприклад, символ Unicode U + 0000 (ASCII NUL) може бути представлений:

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

Однак стандарт Unicode чітко зазначає, що останні три альтернативи не є прийнятними, оскільки вони не є мінімальними. Так трапляється, що байти 0xC0 та 0xC1 ніколи не можуть відображатися у дійсному UTF-8, оскільки єдині символи, які можуть бути закодовані ними, мінімально кодуються як однобайтові символи в діапазоні 0x00..0x7F.

UTF-16 Сурогати

У базовій багатомовній площині (BMP) значення Unicode U + D800 - U + DFFF зарезервовані для сурогатів UTF-16 і не можуть бути закодованими у дійсній UTF-8. Якби вони були дійсними в UTF-8 (що, наголошую, вони не є), тоді сурогати були б закодовані:

  • U + D800 - 0xED 0xA0 0x80 (найменший високий сурогат)
  • U + DBFF - 0xED 0xAF 0xBF (найбільший високий сурогат)
  • U + DC00 - 0xED 0xB0 0x80 (найменший низький сурогат)
  • U + DFFF - 0xED 0xBF 0xBF (найбільший низький сурогат)

Погані дані

Отже, ваші БАД-дані повинні містити зразки, що порушують ці різні приписи.

  • Байт продовження, якому не передує одне з початкових значень байтів
  • Багатосимвольні початкові байти, за якими недостатньо байтів продовження
  • Не мінімальні багатобайтові символи
  • Сурогати UTF-16
  • Недійсні байти (0xC0, 0xC1, 0xF5..0xFF).

Зверніть увагу, що позначка порядку байтів (BOM) U + FEFF, вона ж простір без розриву нульової ширини (ZWNBSP), не може відображатися в UTF-8 без кодування - байти 0xFF і 0xFE не допускаються в дійсній UTF-8. Зашифрований ZWNBSP може відображатися у файлі UTF-8 як 0xEF 0xBB 0xBF, але специфікація техніки є абсолютно зайвою в UTF-8.


У Unicode також є деякі не символи. U + FFFE і U + FFFF - два таких несимволи (і останні дві кодові точки в кожній площині, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF - це інші ). Зазвичай вони не повинні відображатися в даних Unicode для обміну даними, але можуть відображатися в приватному користуванні. Дивіться посилання на поширені запитання Unicode, щоб отримати безліч неприємних деталей, включаючи досить складну історію несимволів в Unicode. ( Виправлення №9: Роз’яснення щодо нехарактерів , яке було опубліковане в січні 2013 року, робить те, що вказує його назва - уточнює значення несимволів )


Дякую за цей чудовий список. Я планую перевірити кожну з них більш детально зараз.
Xeoncross

3
Коментар про те, що несимволи "не повинні відображатися в кодованих даних UTF-8", вводить в оману. Несимволи не повинні відображатися в кодованих даних UTF-8, призначених для відкритого обміну , але тим не менше повинні прийматись
кодерами

@SimonKissane: Мабуть, я був одним із багатьох, яких бентежить виправлення ситуації до виправлення № 9 , яке було видано в січні 2013 року. Цілий розділ поширених запитань Unicode про не символи варто прочитати. Дякую за інформацію. (Я також зазначу, що в моїх коментарях написано "слід", що узгоджується з тим, що сказав стандарт Unicode (але не "сказано"); намір полягає в тому, щоб вони не відображались у "відкритому обміні", але їх можна використовувати для "внутрішнього використання" '.)
Джонатан Леффлер

1
@AdrianMaire: Див. Таблицю 3.6 у розділі 3 стандарту Unicode (9.0.0) (номер сторінки 125; стор. 54 файлу PDF). Я не впевнений, з якими іншими джерелами ви консультуєтесь, але я думаю, що сказане мною висвітлено в цій таблиці.
Джонатан Леффлер

@JonathanLeffler Ви на 100% правильні, дякую за посилання.
Адріан Мейр,

17

Ви можете скористатися цим зручним онлайн-інструментом Джеффрі Бергаміні, щоб перетворити будь-який текст у справді дивний рядок гомогліфів UTF8.

Типовий

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

стати таким:

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


6
Я вважаю, що це тому, що це насправді не допомагає протестувати UTF8: ви не отримуєте нічого близького до повного набору справ, немає "поганих" випадків, і формат насправді не корисний для тестування. Це лише спосіб отримати дивних персонажів.
Адріан Мейр,

Ви пробували? Цей генератор не для розваги. Це дає вам символи з усього діапазону UTF-8, і оскільки вони дивно схожі на справжні символи, ви можете "побачити", які символи створюють вам проблеми. У прикладі, який я опублікував, є 6 символів, які мій iPhone відображає у вигляді знаків запитання.
Шебука 02.03.17

4
ІМО, цей чудовий інструмент міг би бути дуже приємною "доданою вартістю" до пояснення, але сам по собі не відповідає як відповідь у SO (також через те, що сторінка може бути припинена). У будь-якому разі, я згоден, що -1 без пояснень не дуже конструктивний.
Адріан Мейр,

Отже, це "хороші, хороші тестові дані utf-8" ... Варто підтримати, оскільки це стосувалося, IMO
Рондо,


2

Зверху голови:

0xff та 0xfe

Поодинокі високобітові байти

Багатобайтове представлення малобайтових символів - хороший спосіб контрабанди нулів, минулих ранніх перевірок

Позначки порядку байтів - Ви збираєтеся їх ігнорувати?

NFC проти NFD

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.