Действительно хороший, плохой пример тестовых данных UTF-8

Итак, у нас есть шпаргалка по XSS для проверки нашей фильтрации XSS, но кроме пример доброкачественной страницы Я не могу найти никакого зла или искаженные тестовые данные, чтобы убедиться, что мой код UTF-8 может обрабатывать некорректные данные.

Где я могу найти хорошие ... плохие данные для тестирования? Или что такое хитрая последовательность символов?


person Xeoncross    schedule 23.08.2009    source источник
comment
columbia.edu/kermit/utf8.html - еще один хороший вариант.   -  person Xeoncross    schedule 06.12.2010
comment
cl.cam.ac.uk/~mgk25/ucs/ examples / quickbrown.txt   -  person Xeoncross    schedule 25.12.2011
comment
ăѣ???? ծ ềſģȟ Ꭵ???? ǩľḿꞑȯ????????????????ȶ????????ψ????????????1234567890! @ # $% ^ & * () -_ = + [{]};: ', ‹.› /? _ 1_ ~ АḂ Ⲥ???????????? ꞠꓧȊ????????ꓡ????????Ǭ????????Ŗ????????????????????ꓫŸ????ả????ƀ????ḋếᵮℊ???? Ꭵ???? кιṃ դ ⱺ????????????????ŧ????ṽẉ???? ყ ž1234567890! @ # $% ^ & * () -_ = + [{]}; : ', ‹.› /? _ 2_ ~ ????Β????????????????ĢȞỈ????ꓗʟ????ℕ০???????? Հꓢ ṰǓⅤ???? Ⲭ????????????????   -  person Andrew    schedule 10.02.2019


Ответы (5)


Ознакомьтесь с стресс-тестом декодера UTF-8 Маркуса Куна.

person zildjohn01    schedule 23.08.2009
comment
Хотя вы не приложили для этого никаких усилий - эта страница - именно то, что я искал. ;) - person Xeoncross; 25.08.2009
comment
Не забывайте, что знание того, где найти ответ, зачастую так же важно, как и его знание. - person Jonathan Leffler; 25.08.2009
comment
Я предупреждаю вас, что его тест основан на устаревшем определении UTF-8, когда были разрешены 5- и 6-байтовые последовательности до того, как самолеты 17 и выше были удалены. И это означает, что кодовые точки U + FFFE и U + FFFF недействительны в UTF-8, когда согласно консорциуму Unicode они не являются - person Simon Kissane; 23.02.2014

См. Также Как файлу с китайскими иероглифами известно, сколько байтов использовать на символ? - несомненно, есть и другие вопросы SO это тоже поможет.

В 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 не могут встречаться.

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

Есть несколько возможных представлений для некоторых персонажей. Например, символ Юникода 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 (самый большой младший суррогат)

Плохие данные

Итак, ваши данные BAD должны содержать образцы, нарушающие эти различные предписания.

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

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


В Юникоде также есть несимволы. U + FFFE и U + FFFF - два таких несимвола (и последние две кодовые точки в каждой плоскости, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF - другие ). Обычно они не должны появляться в данных Unicode для обмена данными, но могут появляться при частном использовании. См. Ссылку на часто задаваемые вопросы по Unicode для получения множества грязных подробностей, включая довольно сложную историю несимволов в Unicode. (Исправление № 9: Разъяснение о несимволах, выпущенное в январе 2013 г., делает то, что его название предполагает, что поясняет значение не-символов.)

person Jonathan Leffler    schedule 23.08.2009
comment
Спасибо за этот отличный список. Я планирую сейчас изучить каждый из них более подробно. - person Xeoncross; 25.08.2009
comment
Комментарий о том, что несимволы не должны появляться в данных в кодировке UTF-8, вводит в заблуждение. Несимволы не должны появляться в данных в кодировке UTF-8, предназначенных для открытого обмена, но тем не менее должен приниматься кодировщиками / декодерами UTF-8 - person Simon Kissane; 23.02.2014
comment
@SimonKissane: По-видимому, я был одним из многих, кого смущало существующее положение вещей до Исправление № 9, который, кажется, был выпущен в январе 2013 года. Стоит прочитать весь раздел часто задаваемых вопросов Unicode, посвященный несимвольным символам. Спасибо за информацию. (Я также отмечу, что в моих комментариях написано `` следует '', что согласуется с тем, что сказано в стандарте Unicode (но не `` говорит ''); намерение состоит в том, что они не должны появляться в `` открытом обмене '', а могут использоваться для `` внутреннего использования '' '.) - person Jonathan Leffler; 23.02.2014
comment
@AdrianMaire: см. Таблицу 3.6 в главе 3 Unicode (9.0 .0) стандарт (номер страницы 125; p54 файла PDF). Я не уверен, с какими еще источниками вы консультируетесь, но я думаю, что сказанное мной отражено в этой таблице. - person Jonathan Leffler; 02.03.2017
comment
@JonathanLeffler Вы на 100% правы, спасибо за ссылку. - person Adrian Maire; 02.03.2017

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

Типичный

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

стать таким:

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

person Shebuka    schedule 15.12.2016
comment
Я полагаю, это потому, что это не очень помогает тестировать UTF8: вы не получаете ничего близкого к полному набору случаев, нет плохих случаев, и формат не очень полезен для тестирования. Это всего лишь способ заполучить странных персонажей. - person Adrian Maire; 02.03.2017
comment
Ты пробовал это? Этот генератор не для развлечения. Он дает вам символы из полного диапазона UTF-8, и поскольку они странно похожи на реальные символы, вы можете «увидеть», какие символы вызывают проблемы. В примере, который я опубликовал, мой iPhone отображает 6 символов в виде вопросительных знаков в рамке. - person Shebuka; 02.03.2017
comment
ИМО, этот замечательный инструмент мог бы быть очень хорошей добавленной ценностью к объяснению, но он не подходит как ответ сам по себе в SO (также потому, что страница может быть прекращена). Во всяком случае, я согласен, что -1 без объяснения причин не очень конструктивно. - person Adrian Maire; 02.03.2017
comment
Так что это хорошие, хорошие тестовые данные для utf-8 ... стоит положительного голоса, как это связано, IMO - person Rondo; 04.06.2018

Статья Википедии о UTF-8 содержит хорошее резюме того, какие последовательности байтов допустимы / недействителен. Еще одна статья, которую стоит прочитать - W3C I18N FAQ: Multilingual Forms .

person Gumbo    schedule 23.08.2009

С верхней части моей головы:

0xff и 0xfe

Одиночные байты старшего разряда

Многобайтовое представление младших байтовых символов - хороший способ перебросить нули после ранних проверок

Метки порядка байтов - вы собираетесь их игнорировать?

NFC против NFD

person Douglas Leeder    schedule 23.08.2009