Действительно хорошие, плохие примеры тестовых данных UTF-8
Итак, у нас есть обходной лист XSS, чтобы проверить нашу фильтрацию XSS, но кроме пример доброкачественной страницы Я не могу найти никаких злых или искаженных тестовых данных, чтобы убедиться, что мой код UTF-8 может обрабатывать данные с ошибкой.
Где я могу найти хорошие хорошие данные для тестирования? Или что такое сложная последовательность символов?
Ответы
Ответ 2
См. также Как файл с китайскими иероглифами знает, сколько байтов использовать для каждого символа? - без сомнения, есть и другие вопросы 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, но спецификация полностью избыточна в UTF-8.
В Unicode также есть noncharacters. U + FFFE и U + FFFF - два таких нехарактера (и последние два кодовых точки в каждой плоскости, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF,... U + 10FFFE, U + 10FFFF - другие). Они обычно не должны отображаться в данных Unicode для обмена данными, но могут отображаться в частном порядке. См. Ссылку на часто задаваемые вопросы в Unicode для получения множества грязных деталей, включая довольно сложную историю нехарактеров в Unicode. (Исправление № 9: Уточнение о нехарактерах, которое было выпущено в январе 2013 года, делает то, что предлагает его название:— разъясняет значение несимволов.)
Ответ 3
Статья Wikipedias UTF-8 содержит хорошее резюме того, какие байтовые последовательности действительны/недействительны. Другая статья, заслуживающая внимания, - W3C I18N FAQ: Многоязычные формы.
Ответ 4
Вы можете использовать этот удобный онлайн-инструмент от Джеффри Бергамини, чтобы преобразовать любой текст в действительно проводную строку UTF8 Homoglyphs.
Типичный
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tem incididunt ut labore et dolore magna aliqua.
сделайте следующее:
Ḽơᶉëᶆ ȋṕšᶙṁ ḍỡḽǭᵳ ʂǐť ӓṁệẗ, ĉṓɲṩḙċťᶒţûɾ ấɖḯƥĭṩčįɳġ ḝłįʈ, şếᶑ ᶁⱺ ẽḭŭŝḿꝋď ṫĕᶆᶈṓɍ ỉñḉīḑȋᵭṵńť ṷŧ ḹẩḇőꝛế éȶ đꝍꞎôꝛȇ ᵯáꞡᶇā ąⱡîɋṹẵ.
Ответ 5
Сверху моей головы:
0xff и 0xfe
Одиночные биты с высоким бит
Многобайтовое представление низкобайтовых символов - Хороший способ контрабанды нулей после ранних проверок.
Знаки байт-порядка - Вы проигнорируете их?