Действительно хороший, плохой пример тестовых данных 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 они не являются
Саймон Киссейн

35

См. Также Как файлу с китайскими символами известно, сколько байтов использовать на символ? - без сомнения, есть и другие 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 не могут встречаться.

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

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

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

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

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

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


В Юникоде также есть некоторые несимволы . 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, предназначенных для открытого обмена , но, тем не менее, должны приниматься кодировщиками / декодерами UTF-8
Саймон Киссан

@SimonKissane: Похоже, я был одним из многих, кого смутило status quo ante Corrigendum # 9 , которое было выпущено в январе 2013 года. Целый раздел Unicode FAQ, посвященный несимвольным символам , стоит прочитать. Спасибо за информацию. (Я также отмечу, что в моих комментариях написано `` следует '', что согласуется с тем, что сказано в стандарте Unicode (но не `` говорит ''); намерение состоит в том, что они не должны появляться в `` открытом обмене '', а могут использоваться для `` внутреннего использования '' '.)
Джонатан Леффлер,

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

@JonathanLeffler Вы на 100% правы, спасибо за ссылку.
Адриан Мэйр

17

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

Типичный

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

стать таким:

Ë ȋṕšᶙṁ ḍỡḽǭᵳ ʂǐť ӓṁệẗ, čįɳġ ​​ḝłįʈ, ᶁⱺ ẽḭŭŝḿꝋď ṫĕᶆᶈṓɍ ñḉīḑȋᵭṵńť ṷŧ ḹẩḇőꝛế éȶ đꝍꞎôꝛȇ áꞡᶇā îɋṹẵ.


6
Я полагаю, это потому, что это не очень помогает тестировать UTF8: вы не получаете ничего близкого к полному набору случаев, нет «плохих» случаев, и формат не очень полезен для тестирования. Это всего лишь способ получить странных персонажей.
Адриан Мэйр

Ты это пробовал? Этот генератор не для развлечения. Он дает вам символы из полного диапазона UTF-8, и поскольку они странно похожи на фактические символы, вы можете «увидеть», какие символы вызывают проблемы. В примере, который я опубликовал, мой iPhone отображает 6 символов в виде вопросительных знаков в рамке.
Шебука 02

4
ИМО, этот замечательный инструмент мог бы быть очень хорошей «добавленной стоимостью» к объяснению, но он не подходит как ответ сам по себе в SO (также потому, что страница может быть прекращена). Во всяком случае, я согласен, что -1 без объяснения причин не очень конструктивно.
Адриан Мэйр

Итак, это «хорошие, хорошие примерные тестовые данные UTF-8» ... заслуживающие одобрения, поскольку это касается, ИМО
Рондо


2

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

0xff и 0xfe

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

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

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

NFC против NFD

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.